Извините, мы рассматривали возможность предоставления этой функции время от времени, но не нажали на курок.
Для начала, часто утверждение было бы более длинным, чем выписывание чека самостоятельно. Сравните:
assertThat(doc.matches(".*the-regex.*")).isTrue();
assertThat(doc).displayedAs("the doc").containsMatch("the-regex");
(Чтобы быть справедливым, есть случаи, в которых не так просто написать чек самостоятельно.)
1115 И в любом случае, большая часть цели Истины - создавать информативные сообщения об ошибках. В тех случаях, когда у людей есть веские основания опускать эту информацию, они могут прибегнуть кisTrue()
утверждениям.
(Чтобы быть справедливым, сбой isTrue()
приводит к появлению полезного сообщения , в то время как вы хотели бы, чтобы «ожидалось, что он не будет соответствовать: my_regex.» вернемся к assertWithMessage
, как вы сказали, но теперь ваше утверждение снова становится длинным, и вы должны повторить «my_regex», если хотите, чтобы оно было в сообщении.)
(Плюс, это Приятно иметь возможность всегда писать утверждение в идиоматической форме Истины, а не переключаться на неидиоматическую, когда требуется переопределить сообщение.)
Как отмечалось во всех скобках выше, эта функция есть его использование. «Реальные» проблемы в основном:
Здесь есть запрос связанной функции, который позволяет Truth обрезать значения после определенной длины. На самом деле мы получили обратную связь с жалобами на случаи, когда мы выполняем усечение, поэтому здесь необходимо соблюсти баланс :) Но нам кажется разумным предоставить какой-то настраиваемый предел, возможно, основанный на системное свойство. Я приглашаю вас подать сообщение о проблеме (и еще одну для «переопределить сообщение об ошибке по умолчанию», если хотите, даже если я подозреваю, что мы этого не сделаем), хотя я должен предупредить вас, что следующие квартал или два, вероятно, не увидят много развития Истины.
На самом деле, я забыл: в отличие от того, что я сказал в , мой другой ответ , на самом деле есть какой-то способ сделать это: расширить StringSubject
, чтобы переопределить строковое представление, и использовать свой пользовательский предмет:
public static StringSubject assertThatAbbreviatedString(String actual) {
return assertAbout(abbreviatedStrings()).that(actual);
}
public static Subject.Factory<StringSubject, String> abbreviatedStrings() {
return AbbreviatedStringSubject::new;
}
private static final class AbbreviatedStringSubject extends StringSubject {
AbbreviatedStringSubject(FailureMetadata metadata, String actual) {
super(metadata, actual);
}
@Override
protected String actualCustomStringRepresentation() {
return "<actual value omitted>";
// [Edit: Or maybe you can extract the title from the doc and return that?]
}
}
Это позволяет вам написать:
assertThatAbbreviatedString("abcdefghijklmnopqrstuvwyz").containsMatch("foo");
И вывод будет примерно таким:
expected to contain a match for: foo
but was : <actual value omitted>
Если вы хотите иметь возможность подключить конкретное имя, а не <actual value omitted>
, простейшая вещь, вероятно, заключается в использовании assertWithMessage(...).about(...).that(...)
, который можно снова обернуть вспомогательным методом. (Если assertWithMessage
плохо подходит по какой-то причине, я могу использовать по крайней мере еще один подход.)