2009-10-02 2 views
2

나는 다음과 같은 클래스가 :C# : 메서드가 특정 순서로 호출되는지 확인하려면 어떻게합니까?

public class Script 
{ 
    IPrinter _printer; 

    public Script(IPrinter printer) 
    { 
     _printer = printer; 
    } 

    public void Print(TextWriter writer) 
    { 
     _printer.PrintComment(writer, "lolz"); 
     writer.WriteLine("omg this complicates things"; 
     _printer.PrintSpecial(writer); 
     if (signoff) 
      _printer.PrintComment(writer, "kthxbye"); 
    } 
} 

어떻게 것 I 설정에 프린터 방법이 올바른 매개 변수를 사용하여 올바른 순서라고 주장 테스트?

필자는 수동으로 '가짜'프린터를 만들고 작가에 대한 상태 테스트를 할 수 있지만 컨텍스트가 크기 때문에 (특히 스크립트가 작성자와 함께 작동하기 때문에) 나는 그것을 피하고 싶습니다.

나는 nunit 및 rhino mock을 사용하고 있습니다. 이 기능을 쉽게 테스트 할 수 있도록 아키텍처 변경 또는 조롱 절차에 대한 의견을 보내 주시면 감사하겠습니다. 제가 작업하고있는 실제 코드는 불행히도 더 복잡합니다 -하지만 이것은 요지입니다.

답변

5

Rhino에서 동작을 확인하는 데 정적 AAA 구문을 사용할 수 없으므로 AFAIK를 수행하려면 이전 스타일의 "Replay"로 돌아 가야합니다.

나는, 나는 보통 MOQ를 코뿔소 전문가 사용하지,하지만 난이 올바른 생각 :

var mocks = new MockRepository(); 
var printer = mocks.DynamicMock<IPrinter>(); 
using (mocks.Ordered()) 
{ 
    printer.Expect(x => x.PrintComment()); 
    printer.Expect(x => x.PrintSpecial()); 
    printer.Expect(x => x.PrintComment()); 
} 
printer.Replay(); 
Script = new Script(printer); 

... Execute Test... 

printer.VerifyAllExpectations(); 
방법
+0

3 행을 'using (mocks.Ordered())'로 변경하여 구문이 올바른지 확인하십시오. –

+0

아 맞아. 좋아, 나는 그것을, 고마워했다. :) – womp

3

호출되는 순서가 무엇인지 테스트 할 필요가 없습니다. Print 메서드를 호출하여 올바른 결과가 발생했는지 테스트해야합니다.

그러나 실제로이 작업을 수행해야하는 경우 주문 함수가 저장된 모의 IPrinter와 전달 된 매개 변수를 작성하는 것이 가장 좋은 방법이라고 생각합니다.이 매개 변수는 테스트에서 선언 할 수 있습니다.

+2

시험 순서는 행동 테스트라고하며, 그것을 할 많은 이유 때문에, 거기에 나는 당신의 주장에 강력히 동의하지 않습니다. 상태 테스트만으로 단위 테스트를 작성하는 것은 아닙니다! – womp

0

컴파일러를 테스트 할 필요가 없습니다. 어떤 종류의 스레딩을하고 있다면, 나는 그것을 볼 수 있습니다 ...하지만이 경우에, 당신이 올린 것과 함께, 당신은 그렇지 않습니다.

당신이 말했듯이 모의 프린터를 만들어서 그 방법이 순서대로 호출되는지 테스트 할 수는 있지만 중복 될 수 있습니다.

사전 조건 (예 : 이전 방법)이 호출되지 않지만 특정 방법으로 리팩터링 할 필요가 있다고 암시하는 경우 특정 방법에서 예외를 던지면 좋습니다.

또한 template method 패턴을 사용하여 메서드를 순서대로 호출 할 수 있지만 해당 명령을 사용해야하는 추가 개체가 없으면 잔인합니다.