2013-01-16 1 views
1

조롱/스터 빙을 위해 RhinoMocks를 사용하고 단위 테스트를 위해 Nunit 프레임 워크를 사용하고 있습니다.RhinoMock을 사용하여 특정 매개 변수로 메서드 호출을 테스트하는 방법은 무엇입니까?

제가 테스트 케이스를 다음과 고군분투

class A 
    { 
     private int data = -1; 

     public void Initialize (int data) 
     { 
      this.data = data; 
     } 

     public void CallA() 
     { 
      if (data == -1) throw new InvalidArgumentException("data has invalid value -1"); 
      try 
      { 

       A1("a1"); 
       A2("a2"); 
      } 
      catch (AException e) 
      { 
       throw; 
      } 

      catch (Exception e) 
      { 
       throw new AException(ErrorCode.UnknownException, e); 
      } 
     } 
     private void A1(string item) 
     { 
     } 

     private void A2(string item) 
     { 
     } 

    } 

클래스 다음 한 :

  1. InvalidAgrumentException : 하나 Initialized 메서드가 호출되지 않았거나 -1이에 인수로 전달되는 경우가 발생합니다 Initialized. 데이터는 비공개이므로 IL Weaving을 수행하는 TypeMock isolater과 같은 라이브러리가 사용될 때까지는 조롱받을 수 없습니다. 이 예외를 발생 시키려면, 하나의 옵션은 Initialized을 호출하는 것입니다. 올바른 방법은 확실하지 않습니다. (데이터가 다른 곳에서도 -1로 설정 될 수 있기 때문에 추가 기능 호출이 필요합니다.)

  2. "a1"매개 변수로 A1이 호출되고 " a2 "매개 변수.

답변

2

당신은 그렇게 할 수 없습니다.

조롱 프레임 워크는 테스트하려는 클래스의 종속성을 조롱하는 데 사용됩니다. 클래스 자체를 조롱하는 것은 의미가 없습니다. 왜냐하면 클래스 대신 모의 테스트를한다는 의미이기 때문입니다.

또한 클래스의 개인 메서드가 호출되었는지 확인하는 것도 올바르지 않습니다. 당신은 다른 방법으로, 일반적인 두 가지 방법이 있는지 확인해야합니다

  1. 클래스가 올바른 상태
  2. 는 조롱 의존성의 특정 메서드가 호출되었는지 확인 있는지 확인

어떤 것을 사용할 수 있고 사용해야하는지는 주로 테스트하려는 수업에 달려 있습니다.

4

Daniel은 좋은 지적이며 나는 그의 대답을 조금 더 넓히고 싶습니다. 개인 메서드 호출에 의존하는 테스트를하면 매우 취약한 테스트 제품군이 만들어집니다. 개인 메소드는 구현 세부 사항이므로 내부 구현의 변경과 관련하여 항상 변경하고 10-20 테스트의 실패를 관찰하지 않아야합니다.

또 다른 점은 Initilize입니다. 테스트하기가 힘들다면 수업을 얼마나 열심히하는지 상상해보십시오. 로버트 마틴 (Robert Martin)은 자신의 저서 중 하나에서 좋은 지적을하고 있습니다. 그 방법은 다른 방법과 순서를 이전에 불러야한다고 말하지 않습니다.

예를 들어, public void CallA()은 언제, 어떤 인수가 Initialize이어야하는지에 대해 아무 말도하지 않습니다. 입력 인수가있는 Initialize의 생성자를 생성하거나 생성자의 Initialize를 호출하지 않는 이유는 무엇입니까? 이제 당신은 그것이 부름 받았음을 확신합니다. 또 다른 요지는 매직 넘버 -1에 관한 것입니다.

죄송합니다. 그런 디자인으로 일해 왔지만, testing \ mocking 프레임 워크를 사용하는 것과 상관없이 테스트하기가 정말 어렵습니다. 당신은 private 메서드를 모의 할 수 있습니다, 당신은 정적 메서드 호출을 스터핑 할 수 있지만, 모두 좋은 디자인, 조롱 프레임 워크의 능력에 끝납니다.

+0

+1 "깨지기 쉬운 테스트 스위트"및 "임시 연결 방지" –

+0

+1 : 두 시간 디버깅 후 패밀리 초기화 메소드는 항상 훌륭한 찾기입니다. –

+0

+1, 비평에 관한 문제는 없습니다. 귀하의 게시물은 나를 [this] (http://blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling.aspx)로 안내했으며, 앞으로이 코드의 냄새를 피하는 데 도움이 될 것입니다 (가능한 범위 내에서). – Tilak