繁体   English   中英

如何覆盖 google.Truth 中测试的默认失败消息?

[英]How can I override default failure message of a test in google.Truth?

我正在编写一个断言文档不包含特定字符串的测试。 当测试失败时,它会在表单中打印“实际”值

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

文档很长。 最好不要打印它而只打印文档的名称。 我试过 assertWithMessage() 但它只添加一条消息,而不是替换默认消息。

抱歉,我们曾考虑偶尔提供此功能,但并未扣动扳机。

对于初学者来说,它通常会使断言语句比自己编写检查更长。 相比:

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

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

(公平地说,有些情况下自己写支票并不容易。)

无论如何,Truth 的大部分目标是生成信息丰富的失败消息。 如果人们有充分的理由忽略该信息,他们可以退回到isTrue()断言。

(再次公平地说, isTrue()失败基本上没有产生有用的消息,而您希望“不希望包含匹配项:my_regex。”您当然可以使用assertWithMessage将其添加回来,因为您已经说,但现在你的断言语句又变长了,如果你想在消息中重复“my_regex”,你必须重复。)

(另外,能够始终以惯用的 Truth 方式编写断言是很好的,而不是在您想要覆盖消息时切换到非惯用语。)

但是,正如上面所有括号中所指出的,此功能会有其用途。 “真正”的担忧主要是:

  • API 大小。 还要考虑到有些人想要省略消息的不同部分,因此他们可能需要不止一种方法。
  • 人们可能会错误地调用此方法,不小心将信息扔掉。

这里有一个相关的功能请求,它是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(...) <actual value omitted> ,最简单的方法可能是使用assertWithMessage(...).about(...).that(...) ,它您可以再次包装在辅助方法中。 (如果assertWithMessage由于某种原因不适合,我至少可以采用另一种方法。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM