Não sei quantas vezes preciso simular partes do contexto de um controlador ASP.NET MVC. Na verdade – é um requisito se você estiver fazendo qualquer aplicativo da Web ASP.NET MVC.
Isso é kewl! Então, vamos dar uma olhada em alguns auxiliares comuns que uso em meus testes de unidade.
Para sua informação: estou usando o Moq como minha estrutura de teste de simulação
Informações gerais.
Tudo volta para a ControllerContext
propriedade, em uma Controller
instância. Como tal, gosto de ver se podemos passar o máximo de coisas para um único método que retorna uma Mocked
instância disso.
public static Mock<ControllerContext> MockControllerContext(Mock<HttpSessionStateBase> mockSessionStateBase = null)
{
var mockControllContext = new Mock<ControllerContext>();
if (mockSessionStateBase == null)
{
mockSessionStateBase = MockSessionStateBase();
}
mockControllContext.Setup(x => x.HttpContext.Session).Returns(mockSessionStateBase.Object);
return mockControllContext;
}
Cenário: Referenciando a Sessão.
Problema:
public RedirectResult RedirectToAuthenticationProvider(RedirectToAuthenticationProviderInputModel inputModel)
{
// Which provider are we after?
var settings = AuthenticationServiceSettingsFactory.GetAuthenticateServiceSettings(inputModel.ProviderKey);
// We need to remember the state for some XSS protection.
Session[SessionStateKey] = Guid.NewGuid();
settings.State = Session[SessionStateKey].ToString();
// Grab the Uri we need redirect to.
var uri = _authenticationService.RedirectToAuthenticationProvider(settings);
// Redirect!
return Redirect(uri.AbsoluteUri);
}
Configuração:
Podemos ter vários valores / chaves de sessão em um único Context
. Como tal, este método pode ser chamado várias vezes. Se você fornecer uma chave / valor específico, nós o configuramos com isso. Caso contrário, aceite qualquer coisa 🙂
public static Mock<HttpSessionStateBase> MockSessionStateBase(string sessionStateKey = null,
object sessionStateValue = null)
{
var mockSessionStateBase = new Mock<HttpSessionStateBase>();
if (string.IsNullOrEmpty(sessionStateKey) ||
sessionStateValue == null)
{
mockSessionStateBase.Setup(x => x[It.IsAny<string>()]).Returns("some-fake-state");
}
else
{
mockSessionStateBase.Setup(x => x[sessionStateKey]).Returns(sessionStateValue);
}
return mockSessionStateBase;
}
Uso:
var mockSession = ControllerMocks.MockSessionStateBase();
var authenticationController = new AuthenticationController(authenticationService)
{
ControllerContext =
ControllerMocks.MockControllerContext(mockSession).Object
};