2012-11-19 2 views
3

여기 내 시나리오입니다 :.NET 단위 테스트 - MVC와 MOQ/xUnit의 프레임 워크, 예상 반환하지 않는 결과

(예상대로) 나는 저장소 더불어, .NET MVC 4.0 프로젝트에 일하고 있어요, Moq/xUnit 테스트 라이브러리를 .NET 단위 테스트 프로젝트로 구현하려고합니다.

나는이 멀리있어 :

MVC 컨트롤러

private IHOLService _service; 

public PolicyController(IHOLService service) 
{ 
     _service = service; 
} 

public ActionResult Index() 
{ 
    var policies = _service.GetAllPolicies(100, 0).ToList(); 

    return View(policies); 
} 

단위 테스트 클래스

[Fact] 
public void GetPolicies() 
{ 
      // Arrange 
      var mockService = new Mock<IHOLService>(); 
      List<Policy> policy = new List<Policy>() 
      mockService.Setup(cr => cr.GetAllPolicies(10, 0)).Returns(policy); 
      var controller = new PolicyController(mockService.Object); 

      // policy here contains 0 results. 

      // Act 
     var result = (ViewResult)controller.Index(); 

     var model = result.ViewData.Model; // equals 0. 

     // Assert 
     var listCategories = Assert.IsAssignableFrom<List<Policy>>(result.ViewData.Model); 

     // listCategories.Count equals 0 results. 

     Assert.Equal(10, listCategories.Count); // Thus always fails 
    } 

내 문제는 컨트롤러가 모든 것을 직접 호출 할 때 100 개의 정책이로드됩니다.

그러나 테스트를 실행하면 0 개의 제품이로드됩니다.이 제품에서는 서비스 초기 설정과 관련하여 줄을 따라 조롱하는 호출에 문제가 있다고 생각합니다. 이전에 누구도 이것을 가지고 있었고 조언을 제공 할 수 있습니까?

또한 데이터 영역에 보관 된 저장소가 아닌 내 서비스를 테스트해야합니까?

미리 감사드립니다.

답변

2

테스트 코드에서 policy을 빈 목록으로 초기화 한 다음 모의 서비스에이 빈 목록을 반환하도록 알려줍니다. 테스트로드 정책을 만들려면 일부 정책 인스턴스를 policy 목록에 넣어야합니다.

내가 이렇게 보이는 테스트 작성합니다

[Fact] 
public void GetPolicies() 
{ 
    // Arrange 
    var mockService = new Mock<IHOLService>(); 
    Policy expectedPolicy = new Policy(); // substitute for the real way you construct these 
    List<Policy> policy = new List<Policy>() { expectedPolicy }; 
    mockService.Setup(cr => cr.GetAllPolicies(10, 0)).Returns(policy); 

    // Act 
    var result = (ViewResult)controller.Index(); 

    var model = result.ViewData.Model; // equals 0. 

    // Assert 
    var listCategories = Assert.IsAssignableFrom<List<Policy>>(result.ViewData.Model); 

    Assert.Equal(expectedPolicy, listCategories.First());   
} 

를하지만 정말 당신이 단위 테스트하려고하는 코드의 어떤 측면에 달려있다. 내가 볼 수 있듯이이 테스트는 단순히 정책 객체를 예상대로 저장하고 있음을 확인합니다. Policy 인스턴스 자체에 의존하는 논리에 대한 추가 테스트를 작성할 수 있습니다.

+0

어쩌면 나는 이것을 잘못보고있다. 그래서 코드에서 테스트 객체 그룹을 생성한다. 말하자면, 무작위 객체 100 개를 .Setup에로드하고 테스트 객체에 테스트한다. 짐작할 수 있겠지만. 반환은 .GetAllPolicies()의 결과에서 해당 객체로로드된다는 것을 의미합니다. –

+0

나는 단위 테스트, 최종 부분에 대한 자세한 내용과 함께 실제로 내 질문을 업데이트했습니다. 귀하의 의견으로는, 결과가 반환되지 않았기 때문에 문제가있는 컨트롤러 호출과 더 관련이 있다고 생각합니까? –

+0

예 - 테스트에서 반환 할 객체를 만들고,'Return'은 여러분이 지정한 인스턴스를 반환합니다. 실제 GetAllPolicies는 절대 호출되지 않습니다. –