2010-12-13 2 views
0

이 컨트롤러의 생성자는 NewsController라는 컨트롤러를 가지고 있는데,이 컨트롤러의 생성자는 INewsService를 매개 변수로받습니다.서비스 레이어를 호출하는 동작 메서드가 있는지 확인하기위한 단위 테스트

나는이 컨트롤러에서 GetAllNews()라는 메서드를 사용하여 YUI 데이터 테이블을 채우는 데 사용하는 JSON 결과를 반환합니다. 모든 뉴스 항목을 반환하기 위해 뉴스 서비스의 FindAll 메서드가 호출되었는지 확인하는 단위 테스트를 작성하고 싶습니다. 어떻게하면 좋을까요? 내가 현재 가지고 것은 : 시험은 위의 코드로 통과

public NewsControllerTest() 
{ 
    newsServiceStub = MockRepository.GenerateStub<INewsService>(); 
    newsController = new NewsController(newsServiceStub); 
} 

[Test] 
public void GetAllNews_should_use_news_service() 
{ 
    // Arrange 
    List<News> newsList = new List<News>(); 
    newsServiceStub.Stub(s => s.FindAll()).Return(newsList); 

    // Act 
    var actual = newsController.GetAllNews(); 

    // Assert 
    newsServiceStub.VerifyAllExpectations(); 
} 

: 같은 컨트롤러에 대한

public JsonResult GetAllNews() 
{ 
    var items = newsService.FindAll(); 
    var jsonResult = Json(items); 

    return jsonResult; 
} 

내 단위 테스트 보인다. 그러나 GetAllNews()를 아래와 같이 변경하면 패스됩니다. 실패해서는 안됩니까?

public JsonResult GetAllNews() 
{ 
    return null; 
} 
+0

부수적 인 이유는이 유용한 테스트로 간주되는 이유는 무엇입니까? – bzlm

+0

@bzim : 나는 아직 배우는 초보자이다. 나는 무엇을 시험하고 무엇을하지 말아야할지 항상 명확하지 않습니다. –

답변

3

멀리 그것으로 얻을 수있는 경우, 특정 메소드가 호출되었다 단위 테스트하지 마십시오 GetAllNews()가 뉴스 서비스를 사용하는 경우 내가 테스트하는 시도하고있다. 단위 테스트의 요점은 구현이 아니라 행동을 테스트하는 것입니다. FindAll이 호출되는지 테스트하는 것은 구현을 테스트하는 것입니다. 이로 인해 구현을 변경하더라도 동작이 변경되지 않으면 깨지는 취성 테스트가 발생합니다. 클라이언트는 당신이 그들에게 모든 뉴스를 얻는 방법에 상관하지 않으며, 단지 그들에게 모든 뉴스를 얻길 원합니다.

그래서

public void GetAllNews_should_use_news_service() 

public void GetAllNews_should_get_all_the_news 

해야하며, 내가 당신에게 그를 코딩의 세부 사항을 떠날거야.

+0

행동이란? 내 GetAllNews() 메서드의 동작은 무엇입니까? 테스트의 이름을 GetAllNews_should_get_all_the_news라고하면 테스트 코드에 무엇을 포함 시키시겠습니까? 위의 답에서 몇 가지 샘플 코드를 제공해 주시겠습니까? –

1

다른 사람들이 지적한 것처럼 특정 메서드 호출을 테스트하는 것은 장기적으로 취약 할 수 있습니다.

그러나 Rhino.Mocks 관점에서 예상을 확인하려면 스텁 대신 Mock을 사용해야합니다. GenerateStubGenerateMock으로 변경하고 전화를 .Expect() 전화로 변경하십시오. 그게 너의 시험을 고쳐야 해.

+0

모의 (mock)와 스텁 (stub)의 차이점은 무엇입니까? 둘을 언제 사용합니까? –

+0

스텁은 미리 준비된 응답을 제공하는 데 사용됩니다. 모의는 기대를 확인하는 데 사용됩니다. mock을 사용하여 미리 준비된 응답을 제공 할 수 있지만 스텁은 메소드 호출을 추적하지 않으므로 기대를 검증하는 데 사용할 수 없습니다. – PatrickSteele

1

mock과 스텁의 차이점에 대해 흥미로운 Martin Fowler가이 기사를 찾을 수 있습니다. 모의 객체는 행동 검증에 사용하는 동안

http://www.martinfowler.com/articles/mocksArentStubs.html

은 파울러는 상태 검증에 사용되는 스텁을 지적한다.