Как я могу переопределить сообщение об ошибке теста по умолчанию в google.Truth? - PullRequest
1 голос
/ 05 марта 2019

Я пишу тест, который утверждает, что документ не содержит определенной строки. Когда тест не пройден, он печатает «фактическое» значение в виде

expected not to contain a match for: my_regex
but was                            : a huge document that is unreadable

Документ очень длинный. Было бы предпочтительнее не печатать его, а просто напечатать название документа. Я попытался assertWithMessage (), но он только добавляет сообщение, а не заменяет одно по умолчанию.

Ответы [ 2 ]

1 голос
/ 05 марта 2019

Извините, мы рассматривали возможность предоставления этой функции время от времени, но не нажимали на триггер.

Для начала, это часто делает утверждение более длительным, чем самостоятельная проверка.Сравните:

assertThat(doc.matches(".*the-regex.*")).isTrue();

assertThat(doc).displayedAs("the doc").containsMatch("the-regex");

(Если честно, есть случаи, когда выписать чек самостоятельно не так-то просто.)

И в любом случае, большая часть цели Истины - создавать информативные сообщения об ошибках.В тех случаях, когда у людей есть веские основания опускать эту информацию, они могут прибегнуть к isTrue() утверждениям.

(Чтобы быть справедливым, сбой isTrue() в основном приводит к нет полезное сообщение, в то время как вы хотели бы, чтобы «ожидалось, что оно не будет соответствовать: my_regex». Конечно, вы можете добавить его обратно с assertWithMessage, как вы сказали, но теперь ваше утверждение снова становится длинным,и вы должны повторить «my_regex», если хотите, чтобы оно было в сообщении.)

(Плюс, приятно иметь возможность всегда писать утверждение в идиоматической форме, а не переключаться на неидиоматическую, когдаВы хотите переопределить сообщение.)

Как отмечалось во всех скобках выше, эта функция будет использоваться.«Реальные» проблемы в основном:

  • Размер API.Также учтите, что некоторые люди хотят пропустить разные части сообщения, поэтому им может потребоваться более одного метода.
  • Люди могут вызвать этот метод по ошибке, случайно выбросив информацию.

Здесь есть запрос связанной функции, который позволяет Truth обрезать значения после определенной длины.На самом деле мы получили обратную связь с жалобами на случаи, в которых мы делаем усечения, поэтому здесь необходимо соблюсти баланс :) Но нам кажется разумным предоставить какой-то настраиваемый предел, возможно, основанный насистемное свойство.Я приглашаю вас подать проблему (и еще одну для «переопределить сообщение об ошибке по умолчанию», если хотите, даже если я подозреваю, что мы этого не сделаем), хотя я должен предупредить вас, чтоследующие квартал или два, вероятно, не увидят много развития Истины.

0 голосов
/ 06 марта 2019

На самом деле, я забыл: вопреки тому, что я сказал в моем другом ответе , на самом деле есть какой-то способ сделать это: расширить 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 не подходит, есть еще один подход, который я мог бы использовать.)

...