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

1
задан apflieger 5 March 2019 в 16:36
поделиться

2 ответа

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

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

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

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

(Чтобы быть справедливым, есть случаи, в которых не так просто написать чек самостоятельно.)

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

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

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

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

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

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

0
ответ дан Chris Povirk 5 March 2019 в 16:36
поделиться

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

0
ответ дан Chris Povirk 5 March 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: