2011-05-12 60 views
2

我有以下測試:這是否遵循AAA模式?

[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); 
} 

是不是有什麼毛病統一法&斷言?
如果問題不對,應該如何解決這個問題?
編輯:
什麼這種測試:

[Test] 
[Category("HasInterceptors() Tests")] 
public void VerifyThat_WhenHasInterceptorsIsCalledWithANullComponentModel_AnArgumentNullExceptionIsThrown() 
{ 
    LoggingModelInterceptorsSelector selector = new LoggingModelInterceptorsSelector(); 

    Assert.That(new TestDelegate(() => selector.HasInterceptors(null)), Throws.TypeOf<ArgumentNullException>()); 
} 

的行爲,並斷言必須在同一行,以便正確地斷言這件事。至少這是我從中理解的。

這個怎麼樣:

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

回答

3

你不應該統一行爲並斷言。

模式的要點是很容易辨別出不同的部分 - 因此很容易判斷你安排測試的位置,然後在行爲中調用什麼方法,最後是你在聲明什麼。

混合行爲和斷言泥濘,這並不是說,對於那些習慣於AAA的人來說,它會讓他們吃驚(行爲在哪裏?)。


更新(以下崗位的編輯):

大多數測試框架允許你指定的預期異常的測試方法(NUnit的和MSTest的使用ExpectedExceptionAttribute)(這是你的斷言)。你仍然應該分開行動。

+0

那麼應該做什麼?請參閱編輯瞭解更多詳情。 – 2011-05-12 12:26:25

+0

但ExpectedExceptionAttribute會導致測試的Assert階段從流中消失(或者如果考慮流的屬性部分,則首先出現)。 – 2011-05-12 12:46:00

+0

@ the_drow - 但保持清晰度和分離度。這是AAA的動力。清晰和分離,所以你不會失去任何東西。人們習慣於以這種方式進行測試。 – Oded 2011-05-12 12:52:03

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,易於閱讀。

相關問題