2011-07-29 2 views
0

내가 같은 MVC 액션이 말 :단위 테스트 및 SRP (시험 방법의 범위/조직)

public ActionResult CustomerRecord(customerId) 
{ 
    if (_currentUser.CanViewCustomer(customerId)) 
     return View(); 

    else 
    { 
     // user has tried to access an unauthorised record, 
     // should not be here! 
     _logger.Log(new SecurityException()); 
     return View("UnauthorizedAccess"); 
    } 
} 

가 권한이없는 액세스 시도의 경우를 테스트하려면를, 얼마나 많은 검사 방법이 있어야한다?

CustomerRecord_WithUnauthorizedUser_LogsExceptionAndReturnsUnauthorizedView 

또는 내가이 개 시험을 쓰기 수행합니다 :

즉, 내가 하나의 테스트를 작성해야합니까이 문제가 기술적으로 컨트롤러가 SRP를 위반 한 것으로 추측

CustomerRecord_WithUnauthorizedUser_LogsException 
CustomerRecord_WithUnauthorizedUser_ReturnsUnauthorizedView 

,하지만 난 몰라 그것을 자체적으로 문제가되는 것으로 봅니다 (동의하지 않을 경우 수정하십시오). 그 방법을 테스트하는 방법을 잘 모르겠습니다. 방법의 책임 당 하나의 테스트 또는 방법을 통한 단일 경로 당 하나의 테스트?

답변

2

귀하의 컨트롤러가 반드시 두 개를 수행하여 SRP를 위반하는 것은 아닙니다. 책임자 (제어 중)이 하나뿐입니다.

이 특정 예에서 로그 호출이 수행되었다는 것을 주장하는 것에 대해주의를 기울였습니다. 로그 문을 꺼내면 응용 프로그램 기능에 영향을 미치지 않습니다. 과다한 단위 테스트는 그들이 부서지기 쉽고 유지해야 할 고통을줍니다. 이것은 내가 BDD를 너무 좋아하는 이유의 일부입니다.

당신이 감사 모든 시도가 실패로 한 경우 그 가치가 단위 테스트, 그래서 그게 당신이 읽어 후 무슨 일을하는지인지 추측 : 일반적으로

을, 당신은 (어쩌면 당신을 하나 개의 주장을해야한다 단위 테스트 당 하나의 어설트 어설 션을 만들기 위해 Assert 메서드 또는 두 개를 호출해야합니다. 기본적으로 실패한 테스트의 이름을보고 코드를 보지 않고 무엇이 잘못되었는지를 알 수 있기 때문에 좋습니다. . 그래서 두 가지 테스트를하는 것을지지 할 것입니다 ...

+0

"귀하의 컨트롤러는 반드시 두 가지 일을함으로써 SRP를 위반하는 것은 아닙니다. 여전히 하나의 책임 (통제) 만 있습니다." 저는 이것이 매우 모호한 책임 정의라고 생각합니다. 통제의 책임을 어떻게 정의 하시겠습니까? 5 명의 프로그래머에게이 질문을한다면 5 가지 답변을 얻을 수 있을지 걱정됩니다. Manager라는 클래스와 동일합니다. –

2

문제가있는 경우 코드 경로의 어느 부분에서 오류가 발생했는지 즉시 알 수 있기 때문에 테스트 당 하나의 주장 (또는 책임감)을 선호합니다. 이는 테스트 결과를 읽을 때 이해할 수있는 방식으로 테스트의 이름을 지정한다고 가정합니다.