2012-08-09 1 views
2

에서 자신을 호출 : 일반적으로 부분 모의로 끝났다확인 개체가 나는 다음과 같은 코드에 단위 테스트 쓸 수있는 방법 코뿔소 모의 객체

public Image Get(BrowserName browser) 
{ 
    // if no screenshot mode specified it means that regular screenshot needed 
    return this.Get(browser, ScreenshotMode.Regular); 
} 

public Image Get(BrowserName browser, ScreenshotMode mode) {    
    // some code omitted here 
} 
+4

일반적인 개인 메서드를 호출하지 않는 이유는 무엇입니까? –

답변

3

을, 그들은 조금 불쾌 할 수있다.

먼저, 모의하는 방법은 이어야합니다.은 가상이어야합니다. 그렇지 않으면 Rhino Mock이 메소드를 인터셉트 할 수 없습니다. 코드를 다음과 같이 변경해 보겠습니다.

public Image Get(BrowserName browser) 
{ 
    // if no screenshot mode specified it means that regular screenshot needed 
    return this.Get(browser, ScreenshotMode.Regular); 
} 

public virtual Image Get(BrowserName browser, ScreenshotMode mode) {    
    // some code omitted here 
} 

두 번째 방법은 현재 가상입니다. 다음과 같이 부분 모의를 설정할 수 있습니다.

//Arrange 
var yourClass = MockRepository.GeneratePartialMock<YourClass>(); 
var bn = new BrowserName(); 
yourClass.Expect(m => m.Get(bn, ScreenshotMode.Regular)); 

//Act 
yourClass.Get(bn); 

//Assert 
yourClass.VerifyAllExpectations(); 

AAA Rhino Mocks 구문을 사용합니다. 녹음/재생을 사용하기를 원한다면, 그것을 사용할 수도 있습니다.


그렇게하는 방법입니다. 당신은 두 가지 방법이없는 지금

public Image Get(BrowserName browser, ScreenshotMode mode = ScreenshotMode.Regular) 
{ 
    //Omitted code. 
} 

, 그래서를 테스트 할 필요가 없습니다 : ScreenshotMode이 열거하고 당신은 단지 그것을 선택적 매개 변수를 확인 귀하의 처분에 C# 4이있는 경우의 가능성이 더 나은 솔루션입니다 하나는 다른 것을 부른다. (vcsjones는 설명) 방법 가상 만드는 외에

1

두 더 많은 가능성 :

1)

모드가 정기적 인으로 가져 오기위한 테스트 (브라우저 모드)를 작성합니다. 그런 다음 Get (브라우저)에 대해 동일한 테스트를 실행하십시오.

결국 둘 모두 정확히 동일한 결과를 반환해야합니다.

2)

는 인터페이스와 클래스에 제 얻기 메소드의 코드를 추출하고, 테스트 클래스에 주사를 만든다. 두 번째 가져-방법은 단지의 모드를 전달하면서, 모의를 주입하고 처음은 Get-방법은 ScreenshotMode.Regular로 호출되었는지 확인할 수 있습니다을 테스트하는 동안 이제

public Image Get(BrowserName browser) { 
    return whatever.Get(browser, ScreenshotMode.Regular); 
} 

public Image Get(BrowserName browser, ScreenshotMode mode) { 
    return whatever.Get(browser, mode); 
} 

:로를 호출합니다.

관련 문제