2011-03-31 2 views
1

여기 내 문제가 있습니다 :이 경우 모의 작업을 사용하는 방법은 무엇입니까?

나는 단위 테스트를 작성해야하는 n 계층 응용 프로그램이 있습니다. 단위 테스트는 비즈니스 계층에 대한 테스트입니다.

이 테스트에는 Insert()이라는 메서드가 있으며이 메서드는 상속의 두 보호 된 메서드를 사용하고 데이터 액세스 계층의 메서드를 직접 호출합니다.

그래서 DAL 용 mock 개체를 만들었습니다. 그러나 여기에 요점이있다, (편집 :)에서 메서드를 상속에서 보호, 그것은 DAL에서 다른 개체를 사용합니다! 이걸 조롱하는 것은 불가능한 것 같습니다!

다음
public int Insert(MYOBJECT aMyObject) 
    { 
      //first inherited method use the FIRSTDALOBJECT so the mock object --> No problem 
      aMyObject.SomeField= FirstInherited(); 

      //Second inherited method (see after) --> my problem 
      aMyObject.SomeOtherField = SecondInherited(); 

      // Direct access to DALMethod, use FIRSTDALOBJECT so the mock -->No Problem 
      return this.FIRSTDALOBJECT.Insert(aMyObject);    
    } 

가 SecondInherited 방법입니다 :

protected string SecondInherited() 
    { 
     // Here is my problem, the mock here seems not be possible for seconddalobject           
     return (new SECONDDALOBJECT Sdo().Stuff()); 
    } 

그리고 여기에 단위 시험 방법 코드 :

[TestMethod()] 
    public void InsertTest() 
    { 
     BLLCLASS_Accessor target = new BLLCLASS_Accessor(); 
     MYOBJECT aMyObject = new MYOBJECT { SomeField = null, SomeOtherField = 1 }; 
     int expected = 1; 
     int actual; 

     //mock 
     var Mock = new Mock<DAL.INTERFACES.IFIRSTDALOBJECT>(); 
     //Rec for calls 
     List<SOMECLASS> retour = new List<SOMECLASS>(); 
     retour.Add(new SOMECLASS()); 

     //Here is the second call (last from method to test) 
     Mock 
      .Setup(p => p.Insert(aMyObject)) 
      .Returns(1); 

     // Here is the first call (from the FirstInherited()) 
     Mock 
      .Setup(p => p.GetLast()) 
      .Returns(50); 
     // Replace the real by the mock 
     target.demande_provider = Mock.Object; 

     actual = target.Insert(aMyObject); 
     Assert.AreEqual(/*Some assertion stuff*/); 
    } 

감사합니다 여기

테스트 코드에 대한 방법입니다 모든 질문을 읽기 :-) 그것이 충분히 명확한 희망.

답변

3

당신의 텍스트는 코드 예제가 protected 동안 SecondInheritedprivate라고 말할 것 같다. 어쨌든, protected이 아닌 경우 첫 번째 단계로 액세스 한정자를 변경하는 것이 좋습니다.

당신은 테스트 목적으로 만 서브 클래스를 생성하고, SECONDDALOBJECT를 생성 방지하고 당신의 시험에 적합한 몇 가지 값을 반환이SecondInherited을 대체 할 수 있습니다.

이렇게하면 을 테스트 할 클래스를 최소한으로 변경하여 첫 번째 단위 테스트를 작성하여 무언가를 깨뜨릴 기회를 최소화 할 수 있습니다.. 단위 테스트를 완료하면 더 많은 리팩토링을 안전하게 수행 할 수 있으므로 Dependency Injection 또는 Factory와 같은 더 나은 (테스트 가능/모의) 디자인을 얻을 수 있습니다. (Factory Method보다 더 Abstract Factory을 선호 할 것입니다. 후자는 실제로 테스트 된 클래스의 서브 클래스를 계속 유지해야하기 때문입니다.

이 기술 (및 더 많은 것)을 배우기를위한 기본적인, 높게 추천되는 책은 Working Effectively With Legacy Code이다.

+0

그것은 실수로 죄송합니다. – bAN

+0

+1 : 빠른 결과를위한 좋은 해결책 –

+0

@bAN, 해명 덕분에 해결책이 훨씬 쉽습니다. –

2

MOQ로 모의 할 기회가 없습니다. SECONDDALOBJECT 클래스

  • 리팩터링 코드를 조롱

    1. 사용 TypeMock 또는 두더지, 그래서 SECONDDALOBJECT의 인스턴스가있는 방법으로 생성되지 않지만 방법이 될 수 있습니다 : 두 가지 옵션이 있습니다 조롱 (공장 방법, DI, ...) (선호!)
  • 관련 문제