Cenários de simulação de controlador ASP.NET MVC comuns

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 ControllerContextpropriedade, em uma Controllerinstância. Como tal, gosto de ver se podemos passar o máximo de coisas para um único método que retorna uma Mockedinstâ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
};