Unité de contrôleur de test à l'aide de MOQ . Comment se moquer de httpcontext
Je suis en train de tester mon Compte contrôleur en utilisant Moq
voici ce que j'ai fait
Contrôleur
private readonly IWebSecurity _webSecurity;
public AccountController(IWebSecurity webSecurity)
{
this._webSecurity = webSecurity;
}
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && _webSecurity.login(model))
{
return RedirectToLocal(returnUrl);
}
//If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
private ActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
IWebSecurity
public interface IWebSecurity
{
bool login(LoginModel model);
}
public class WebSecurity : IWebSecurity
{
public bool login(LoginModel model)
{
return WebMatrix.WebData.WebSecurity.Login(model.UserName, model.Password, model.RememberMe);
}
}
MyTestClass
[AfterScenario]
public void OnAfterScenario() {
mockRepository.VerifyAll();
}
LoginModel loginModel;
AccountController _controller;
#region Initializing Mock Repository
readonly Mock<IWebSecurity> mockRepository = new Mock<IWebSecurity>(MockBehavior.Loose);
ViewResult viewResult;
#endregion
[Given]
public void Given_Account_controller()
{
_controller = new AccountController(mockRepository.Object);
}
[When]
public void When_login_is_called_with_LoginModel(Table table)
{
loginModel = new LoginModel
{
UserName = table.Rows[0][1],
Password = table.Rows[1][1]
};
mockRepository.Setup(x => x.login(loginModel)).Returns(true);
viewResult = (ViewResult)_controller.Login(loginModel, "/");
}
[Then]
public void Then_it_should_validate_LoginModel()
{
Assert.IsTrue(_controller.ModelState.IsValid);
}
[Then]
public void Then_it_should_return_default_view()
{
Assert.AreEqual(viewResult.ViewName, "Index");
}
Mais mon test est un échec et sa présentation attente lorsque viennent à Url.IsLocal
dans Redirect to Local
méthode . donc, je pense que c'est ici devraient se moquer de mon httpcontextbase et httpcontextrequestbase .
Mais ne savent pas comment se moquent de ce .
Merci d'avance
OriginalL'auteur Ancient | 2013-06-17
Vous devez vous connecter pour publier un commentaire.
Dans cette question particulière, vous pouvez simplement remplacer le contrôleur de
Url
propriété avec moquéUrlHelper
classe.Pour
HttpContext
moqueur, il pourrait être bon d'injecterHttpContextBase
à votre contrôleur et configurer votre DI conteneur de servir la bonne pour vous. Il serait facilité en se moquant plus tard à des fins de test. Je crois Autofac a une manière automatique pour configurer un conteneur pour l'ASP.NET liée à des classes commeHttpContextBase
.MODIFIER
Il semble que vous ne pouvez pas se moquer de
UrlHelper
Moq, comme @lazyberezovsky a écrit: - vous pouvez vous moquer, seules les interfaces et les méthodes virtuelles. Mais cela ne vous empêche pas d'écrire votre propre moqué de l'objet. C'est vrai que vous avez besoin pour se moquer deHttpContext
, comme il est requis parUrlHelper
constructeur (en fait, il est requis parRequestContext
constructeur, qui est requis parUrlHelper
constructeur)... d'Ailleurs,IsLocalUrl
ne pas utiliser quoi que ce soit à partir de leur contexte, de sorte que vous n'avez pas à fournir de réglage supplémentaire.Exemple de code devrait ressembler à ça:
Contrôleur:
Tests:
malheureusement, le développement MVC équipe contrôleur dépendent directement de
UrlHelper
classe. Qui dépend directement deRequestContext
. Je voudrais qu'il soit interfaces, mais l'équipe a fait cette étrange décision.vous avez raison. C'est dommage, le Contrôleur et le UrlHelper sont donc étroitement liés. J'ai édité ma réponse et a fourni un peu de code pour la présentation.
Super Merci beaucoup 🙂
OriginalL'auteur tdragon
Vous devez vous moquer de la
HttpContext
. J'ai écrit cette fonction d'aide pour faire ce genre de choseset dans une méthode de test que vous utilisez comme ça
Espère que cela aide
BasePath
est à venir 2 - Quelle est la Assembley nom de MockHttpSession(); ?Désolé j'ai oublié quelques choses dans la démo. J'ai intégré la réponse. Le BasePath est une variable simple que j'utilise pour stocker les fichiers. Maintenant, tout devrait fonctionner
OriginalL'auteur Iridio