我有以下测试:
[Test]
public void VerifyThat_WhenHasInterceptorIsCalledWithAComponentModelThatHasTheLogAttribute_TheReturnValueIsTrue()
{
// Arrange
Mock<ComponentModel> mock = /* ... */;
LoggingInterceptorsSelector selector = new LoggingInterceptorsSelector();
// Act & Assert togheter
Assert.That(selector.HasInterceptors(mock.Object), Is.True);
}
统一法案是否有问题&amp;断言?
如果错误,应该采取什么措施来解决这个问题呢?
编辑:
这种测试怎么样:
[Test]
[Category("HasInterceptors() Tests")]
public void VerifyThat_WhenHasInterceptorsIsCalledWithANullComponentModel_AnArgumentNullExceptionIsThrown()
{
LoggingModelInterceptorsSelector selector = new LoggingModelInterceptorsSelector();
Assert.That(new TestDelegate(() => selector.HasInterceptors(null)), Throws.TypeOf<ArgumentNullException>());
}
act和assert必须在同一行,才能正确断言。至少这是我从中理解的。
这个怎么样:
[Test]
[Category("HasInterceptors() Tests")]
public void VerifyThat_WhenHasInterceptorsIsCalledWithANullComponentModel_AnArgumentNullExceptionIsThrown()
{
LoggingModelInterceptorsSelector selector = new LoggingModelInterceptorsSelector();
var testDelegate = new TestDelegate(() => selector.HasInterceptors(null));
Assert.That(testDelegate, Throws.TypeOf<ArgumentNullException>());
}
这更符合AAA模式吗?
答案 0 :(得分:4)
我愿意:
[Test]
public void VerifyThat_WhenHasInterceptorIsCalledWithAComponentModelThatHasTheLogAttribute_TheReturnValueIsTrue()
{
// Arrange
Mock<ComponentModel> mock = /* ... */;
LoggingInterceptorsSelector selector = new LoggingInterceptorsSelector();
// Act
var result = selector.HasInterceptors(mock.Object);
// Assert
Assert.That(result, Is.True);
}
AAA且易于阅读。
答案 1 :(得分:3)
你不应该统一行为并断言。
模式的要点是能够轻松识别不同的部分 - 因此很容易分辨出你在哪里安排测试,然后在行为中调用什么方法,最后,你要断言的是什么。
混合行为和断言混淆这一点,更不用说,对于那些习惯于AAA的人来说,这会让他们感到意外(行为在哪里?)。
更新(编辑帖子后):
大多数测试框架允许您在测试方法中指定预期的异常(nUnit和MSTest使用ExpectedExceptionAttribute
)(这是您的断言)。你仍然应该单独行动。