Главное, что вам не хватает - это знание того, как разработать проект ASP.NET MVC для тестирования.
Вы должны спроектировать свой контроллер, чтобы использовать внедрение зависимостей. То есть контроллеры не должны использовать конкретную реализацию AuthenticationService, а использовать IAuthenticationService, конкретная реализация которого будет предоставлена во время выполнения. На данный момент, когда контроллер создан, AuthenticationService также создается. Но в тестовом сценарии HttpContext имеет значение null, и создание AuthenticationService завершается с ошибкой NullReference. Если вы разрабатываете это через интерфейс, в целях тестирования вы будете предоставлять поддельную реализацию AuthenticationService контроллеру, и он не будет выдавать исключение.
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;
}
}
В тестовом сценарии вы могли бы использовать некоторую библиотеку-макет для фальшивой реализации IAuthenticationService, например moq . И поставьте ценность для этого через насмешку
var mockAuthenticationService = new Mock<IAuthenticationService>();
//setup mockAuthenticationService
var controller = new ApuradorController(mockAuthenticationService.Object);
На этот раз он не будет генерировать исключения.
Информация, упомянутая выше, не поможет, если вы не понимаете принципов разработки проекта, проверяемого модулем. Для быстрого начала прочитайте эту ссылку. Для дальнейшего чтения, адресных книг о asp.net mvc, я бы рекомендовал их Стивену Сандерсону. Основная идея конструкции контроллера, тестируемого модулем, заключается в том, что у вас должна быть возможность поставлять поддельные компоненты в контроллер, поддельные репозитории, сервисы и т. Д. И оставлять реальную только ту часть контроллера, которая тестируется модулем. Затем протестируйте итерации контроллера с этими поддельными частями. Модульное тестирование означает тестирование этого взаимодействия. Если взаимодействия правильные, они будут правильными с реальными реализациями этих компонентов. Если они не правы, тест не пройден.