J'ai un Area
sur mon site MVC. Cette zone a la configuration typique Controller/Model/View.Se moquant d'un contrôleur pour tester ViewEngine dans une zone - nullreference et RouteData
En tant que contrôleur je le code suivant:
public class DocumentCreatorController : Controller
{
// GET: Templates/DocumentCreator
public ActionResult OfferTemplate(BaseDocumentViewModel data)
{
return this.Pdf(nameof(OfferTemplate), data, "File.pdf");
}
}
La méthode this.Pdf
fait deux ou trois choses, mais l'intéressant est qu'il revient à l'appel ViewEngine:
var viewResult = ViewEngines.Engines.FindPartialView(controllerContext, partialViewName);
Here I appelez le FindPartialView
avec un ControllerContext
et un PartialViewName
. Mon PartialViewName
provient du nameof(OfferTemplate)
à partir de l'action du contrôleur OfferTemplate
. Je pense que le controllercontext
est mon défi.
Mon défi:
Quand je veux mettre cela dans un test unitaire (en utilisant QMC), j'ai le code suivant basé sur des pages telles que Mocking The RouteData Class in System.Web.Routing for MVC applications et Mocking Asp.net-mvc Controller Context:
[TestMethod]
public void OfferTemplate()
{
var ctr = SetupControllerWithContext();
}
private static DocumentCreatorController SetupControllerWithContext()
{
var routeData = new RouteData();
routeData.Values.Add("controller", "DocumentCreatorController");
routeData.Values.Add("action", "OfferTemplate");
var request = new Mock<HttpRequestBase>();
request.Expect(r => r.HttpMethod).Returns("GET");
var mockHttpContext = new Mock<HttpContextBase>();
mockHttpContext.Expect(c => c.Request).Returns(request.Object);
var controllerContext = new ControllerContext(mockHttpContext.Object
, routeData, new Mock<ControllerBase>().Object);
DocumentCreatorController ctr = new DocumentCreatorController();
ctr.ControllerContext = controllerContext;
return ctr;
}
Ce qui donne l'erreur suivante:
Eesy.Websites.Api.Tests.Controllers.DocumentCreatorControllerTest.OfferTemplate threw exception: System.NullReferenceException: Object reference not set to an instance of an object.
Ceci je ne comprends pas.
Ma configuration du dossier:
image de débogage sur ControllerContext à appeler la FindPartialView:
Quelqu'un a une idée? Est-ce parce que j'ai mal configuré RouteData?
Il faudrait être 'routeData.Values.Add (" controller "," DocumentCreator ");' (pas '" DocumentCreatorController ") –
Vous essayez de simuler et de tester le code du framework. Résumé cette fonctionnalité dans le code que vous contrôlez, vous pouvez donc tester en isolation si nécessaire. Cela semble être un [problème XY] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Quel est le but ultime que vous essayez d'atteindre? – Nkosi
@Nkosi Bon point. J'essaie de générer automatiquement un PDF (HTML au format PDF) en utilisant un test unitaire, donc je peux vérifier le processus de génération de PDF fonctionne. Et j'espérais pouvoir le faire en utilisant mon contrôleur, mais évidemment, il serait logique de faire un service au lieu d'éviter tout cela :-) –