这是否遵循AAA模式?

时间:2011-05-12 12:16:00

标签: unit-testing mocking

我有以下测试:

[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模式吗?

2 个答案:

答案 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)(这是您的断言)。你仍然应该单独行动。