我正在编写一个断言文档不包含特定字符串的测试。当测试失败时,它会在表单中打印“实际”值
expected not to contain a match for: my_regex
but was : a huge document that is unreadable
文件很长。最好不要打印它而只打印文档的名称。我试过 assertWithMessage() 但它只添加一条消息,而不是替换默认消息。
我正在编写一个断言文档不包含特定字符串的测试。当测试失败时,它会在表单中打印“实际”值
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 方式编写断言,而不是在您想要覆盖消息时切换到非惯用的方式。)
但是,正如上面所有括号中所指出的,此功能将有其用途。“真正”的担忧主要是:
这里有一个相关的特性请求,就是让 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
由于某种原因不适合,我至少可以采用另一种方法。)