가장 중요한 것은 테스트를 위해 ASP.NET MVC 프로젝트를 설계하는 방법에 대한 지식입니다.
종속성 삽입을 사용하도록 컨트롤러를 설계해야합니다. 즉, 컨트롤러는 AuthenticationService의 구체적인 구현을 사용해서는 안되며 IAuthenticationService를 사용하여 런타임에 구체적 구현이 제공됩니다. 지금은 컨트롤러가 생성 될 때 AuthenticationService도 생성됩니다. 그러나 테스트 시나리오에서 HttpContext는 null이고 NullReference 예외로 AuthenticationService 만들기가 실패합니다. 이 인터페이스를 통해 설계하면 테스트 목적으로 AuthenticationService의 가짜 구현을 컨트롤러에 제공하고 예외를 throw하지 않습니다.
public interface IAuthenticationService
{
IPrincipal User {get;}
}
public class AuthenticationService : IAuthenticationService
{
private IPrincipal _user = HttpContext.Current.User;
...
}
//the controller
[Authorize(Roles = "Administrador")]
public class ApuradorController : Controller
{
private readonly Questiona2011Context _context = new Questiona2011Context();
private readonly IAuthenticationService _authenticationService;
public ApuradorController(IAuthenticationService authenticationService)
{
_authenticationService = authenticationService;
}
}
테스트 시나리오에서는 예를 moq을 위해, 가짜 IAuthenticationService 구현을위한 약간의 조롱 라이브러리를 사용할 수 있습니다. 조롱을 통해 값을 제공하십시오.
var mockAuthenticationService = new Mock<IAuthenticationService>();
//setup mockAuthenticationService
var controller = new ApuradorController(mockAuthenticationService.Object);
이번에는 예외가 발생하지 않습니다.
위의 정보는 단위 테스트 가능 프로젝트 디자인의 원칙을 이해하지 못하는 경우 유용하지 않습니다. 빠른 시작을 위해 this 링크를 읽으십시오. 추가 읽기, 주소록에 대한 asp.net mvc, 나는 그들을 추천합니다 스티븐 샌더슨. 단위 테스트 할 수있는 컨트롤러 설계의 주된 아이디어는 가짜 구성 요소를 컨트롤러, 가짜 리포지토리, 서비스 등에 공급하고 유닛 테스트를 거친 컨트롤러의 일부만을 그대로 두는 것입니다. 그런 다음 위조 된 부분과 컨트롤러 반복을 테스트하십시오. 단위 테스트는 해당 상호 작용을 테스트하는 것을 의미합니다. 상호 작용이 올 바르면 해당 구성 요소의 실제 구현에서 올바를 것입니다. 그들이 틀리면 테스트가 실패합니다.
내가 제안하는 것을해라 : var authenticationService = new Mock(); var 컨트롤러 = 새로운 ApuradorController (authenticationService); 하지만 예외가 발생했습니다 : 'Moq.Mock '매개 변수 형식 'App.Services.IAuthenticationService' –
할당 할 수없는 새 ApuradorController (authenticationService.Object); 사용해야합니다. ? –
네, 그렇게해야합니다. 또한 해당 모의 ApplicationService의 User 속성을 사용하려면 Setup()을 수행해야합니다. moq documentation wiki의 Setup()에 대해 읽어보십시오. - http://code.google.com/p/moq/wiki/QuickStart – archil