2011-04-13 4 views
1

저는 단위 테스트를 처음 접했고이 경우 제대로 테스트하는 법을 배울 수 없습니다. I는 "_userService"에 대한 별도의 검사 무리가mspec & rhino mocks가 예외 테스트를 예상합니다.

public ActionResult Register(formModel model) 
{ 

    if (ModelState.isValid) { 

     try { 

      _userService.CreateUser(a bunch of parameters here); 
      return RedirectToAction(some other action); 
     } 
     catch (Exception e) 
     { 

      ModelState.AddModelError("",e.Message); 

     } 

    } 

    return View(); 
} 

:

난 (의사 코드) 제어기 방법이있다. "CreateUser"메서드는 새로운 사용자를 생성하고 아무것도 반환하지 않거나 try catch에서 컨트롤러 서라운드에 버블 링하고 ModelState에 예외를 추가하는 오류 (예 : 사용자가있는 경우)가 발생하면 예외를 throw합니다.

서비스를 조롱하고 올바르게 반환해야한다고 주장했기 때문에 아무 것도 반환하지 않으며 내 컨트롤러에서 호출한다는 사실을 알고 싶기 때문에 올바르게 호출되었습니다 (assertwascalled 구문 사용).

userservice에서 오류가 발생했을 때 리디렉션하지 않아야하고 그 예외를 modelstate에 추가해야하는지 여부를 테스트하는 방법은 확실하지 않습니다. rhino mock을 사용하면 모의 작업을 할 수는 있지만 단위 테스트의 책 예술은 이에 대해 조언합니다.

지금 바로 테스트 할 때 모델 오류를 수동으로 추가하고 (사용자 서비스의 경우 신경 쓰지 않음) 오류가있는 경우 컨트롤러가 동일한보기를 반환하는지 테스트합니다. 이것에 대해 올바른 방법인가요? 또는 _userService를 스텁하여 오류가 발생하고 modelstate에 추가되는지 확인하는 별도의 테스트를 작성해야합니까? 아니면 내가 그 사건을 시험해 봐야하지 않겠 니? 나는 모든 것을 분석하고 모델 스테이트를 사용하는 테스트가 이것을 만족시키기에 충분할 것 같은 느낌이 들었습니다. ...

답변

1

당신의 모의가 공동 작업 클래스를 나타냅니다. mock과 stub의 차이점에 너무 매달 리지 않을 것입니다. 그것은 여전히 ​​공동 수업입니다.

단위 테스트는 클래스 사용 방법과 클래스가 공동 작업자와 상호 작용하는 방식을 설명하는 것으로 생각할 수 있습니다.

Given a controller 
When I register the model 
Then the class should ask the user service to create a user. 

그리고 :

Given a controller 
Given the user service is broken 
When I register the model 
Then the class should attach the error to the model state. 

그것은 당신이 조롱보다는 스텁하고 알려줍니다 그 두 번째 Given의 두 가지 사례가 있습니다. 사용자 서비스를 망가뜨린 것처럼 설정하고 있습니다. 클래스가 동작하는 컨텍스트가 다르므로 스텁해야하므로 예외를 throw해야합니다.

이 줄을 테스트에 주석으로 추가하면 의미가 있습니다. 이해가된다면 책을 무시하십시오.

BTW, 이것은 단위 수준의 BDD입니다. "Given, When, Then"을 시나리오 수준에서와 마찬가지로 단위 수준에서 사용할 수 있으며 테스트의 논리를 생각하는 데 도움이 될 수 있습니다. 이를 위해 BDD 시나리오 도구를 사용하지 마십시오.

+0

감사합니다. 그런 식으로 테스트하는 것이 나에게 의미가 있습니다. – maciek

관련 문제