2011-05-12 2 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

행동을 통일하고 단언해서는 안됩니다.

패턴의 요점은 여러 부분을 쉽게 구분할 수 있다는 것입니다. 따라서 테스트를 정렬하는 위치를 쉽게 알 수 있고, 어떤 메서드가 act에서 호출되는지, 마지막으로 사용자가 주장하는 내용을 쉽게 알 수 있습니다.

AAA에 익숙한 사람들을 위해이 말을하고 행동을 뒤섞어 버리는 것은 놀랄만 한 것입니다 (행동은 어디에 있습니까?). (게시물의 편집 다음)


업데이트 :

대부분의 테스트 프레임 워크는 당신이 예상되는 예외를 지정할 수 있습니다 (즉, 당신의 어설의) 시험 방법 (NUNIT 및 MSTEST는 ExpectedExceptionAttribute 사용). 여전히 별도로 행동해야합니다.

+0

그럼 어떻게해야합니까? 자세한 내용은 편집을 참조하십시오. –

+0

하지만 ExpectedExceptionAttribute는 테스트의 Assert 단계를 흐름에서 사라지게 만듭니다 (또는 흐름의 속성 부분을 고려하면 먼저 나타납니다). –

+0

@the_drow - 선명도와 분리가 유지됩니다. 이것이 AAA의 추진력입니다. 명료성과 분리 성이 있으므로 아무 것도 잃지 않습니다. 그리고 사람들은 이러한 방식으로 예외를 테스트하는 데 익숙합니다. – Oded

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 쉽게 읽을 수 있습니다.

관련 문제