J'ai des difficultés à tester les contrôleurs. mon contrôleur d'origine pour le test a regardé quelque chose comme ceci:asp.net mvc Comment tester les contrôleurs correctement
SomethingController CreateSomethingController()
{
var somethingData = FakeSomethingData.CreateFakeData();
var fakeRepository = FakeRepository.Create();
var controller = new SomethingController(fakeRepository);
return controller;
}
Cela fonctionne bien pour la majorité des tests jusqu'à ce que je suis la partie Request.IsAjaxRequest()
du code. Alors j'ai dû simuler le HttpContext et HttpRequestBase. Donc, mon code a alors changé pour ressembler à:
public class FakeHttpContext : HttpContextBase
{
bool _isAjaxRequest;
public FakeHttpContext(bool isAjaxRequest = false)
{
_isAjaxRequest = isAjaxRequest;
}
public override HttpRequestBase Request
{
get
{
string ajaxRequestHeader = "";
if (_isAjaxRequest)
ajaxRequestHeader = "XMLHttpRequest";
var request = new Mock<HttpRequestBase>();
request.SetupGet(x => x.Headers).Returns(new WebHeaderCollection
{
{"X-Requested-With", ajaxRequestHeader}
});
request.SetupGet(x => x["X-Requested-With"]).Returns(ajaxRequestHeader);
return request.Object;
}
}
private IPrincipal _user;
public override IPrincipal User
{
get
{
if (_user == null)
{
_user = new FakePrincipal();
}
return _user;
}
set
{
_user = value;
}
}
}
SomethingController CreateSomethingController()
{
var somethingData = FakeSomethingData.CreateFakeData();
var fakeRepository = FakeRepository.Create();
var controller = new SomethingController(fakeRepository);
ControllerContext controllerContext = new ControllerContext(new FakeHttpContext(isAjaxRequest), new RouteData(), controller);
controller.ControllerContext = controllerContext;
return controller;
}
Maintenant son arrivé à ce stade de mon contrôleur où j'appelle Url.Route
et Url
est nulle. Donc, il semble que je dois commencer à se moquer des routes pour mon contrôleur.
Je semble passer plus de temps à googler sur la façon de simuler/simuler des objets et ensuite déboguer pour s'assurer que mes contrefaçons sont correctes que l'écriture réelle du code de test. Existe-t-il un moyen plus facile de tester un contrôleur? J'ai regardé le TestControllerBuilder de MvcContrib qui aide avec certains des problèmes mais ne semble pas faire tout. Y at-il autre chose disponible qui fera l'affaire et me permettra de me concentrer sur l'écriture des tests plutôt que d'écrire des simulacres?
Merci
Le problème n'est pas avec vos tests, c'est avec votre action de contrôleur. Vous devriez essayer d'éviter d'utiliser le contexte http dans votre action et n'utiliser que les dépendances que vous fournissez dans votre constructeur. Les actions doivent être très petites. –