2 votes

La classe UrlHelper lance une exception nulle dans Asp.net mvc

Je développe une application web Asp.net mvc. Je fais des tests unitaires pour mon application. J'utilise Moq pour simuler des objets. J'essaie de simuler la classe Url helper. J'ai trouvé ce lien asp.net mvc : comment simuler Url.Content("~") ? . En utilisant cette classe, je peux simuler UrlHelper dans le test unitaire.

J'ai créé un BaseController comme ceci

public class BaseController : Controller
{
    private IUrlHelper _urlHelper;

    public new IUrlHelper Url
    {
        get { return _urlHelper; }
        set { _urlHelper = value; }
    }
}

Voici le IUrlHelper interface/abstraction

public interface IUrlHelper
{
    string Action(string actionName);
    string Action(string actionName, object routeValues);
    string Action(string actionName, string controllerName);
    string Action(string actionName, RouteValueDictionary routeValues);
    string Action(string actionName, string controllerName, object routeValues);
    string Action(string actionName, string controllerName, RouteValueDictionary routeValues);
    string Action(string actionName, string controllerName, object routeValues, string protocol);
    string Action(string actionName, string controllerName, RouteValueDictionary routeValues, string protocol, string hostName);
    string Content(string contentPath);
    string Encode(string url);
    string RouteUrl(object routeValues);
    string RouteUrl(string routeName);
    string RouteUrl(RouteValueDictionary routeValues);
    string RouteUrl(string routeName, object routeValues);
    string RouteUrl(string routeName, RouteValueDictionary routeValues);
    string RouteUrl(string routeName, object routeValues, string protocol);
    string RouteUrl(string routeName, RouteValueDictionary routeValues, string protocol, string hostName);
}

Je me moque de la Url.Content() dans le test unitaire comme ceci

Mock<IUrlHelper> urlHelperMock = new Mock<IUrlHelper>();
urlHelperMock
    .Setup(x => x.Content(It.IsAny<string>()))
    .Returns<string>(x => "~/" + x);// Mock Content method of Url Helper

Le test a été effectué avec succès et fonctionne bien. Le problème est que je ne peux pas l'utiliser dans une application en temps réel. Je veux dire que lorsque je lance mon application et que j'appelle Url.Content("path"), l'exception null est levée.

Par exemple

public class ExampleController : BaseController
{
    public string GetPath()
    {
       return Url.Content("~/Path/To/File");
    }
}

Url.Content dans ce code lance l'exception null. Il fonctionne bien dans le test unitaire. Comment puis-je corriger ce code ?

2voto

Nkosi Points 95895

Dans ce cas, il n'est pas vraiment nécessaire d'abstraire l'élément UrlHelper . Il suffit de créer l'aide pour que le test fasse ce qui est nécessaire.

Par exemple, en supposant que

public class ExampleController : Controller {
    public string GetContent() {
       return Url.Content("~/Path/To/File");
    }
}

Voici un test qui simule le UrlHelper utilisation de moq pour fonctionner comme dans l'exemple original

[TestClass]
public class UrlHelperTest {
    [TestMethod]
    public void MockUrlHelper() {
        //Arrange            
        var expectedPath = "~/Path/To/File";
        var expectedContent = "<p>Fake content here<p>";
        var urlHelperMock = new Mock<UrlHelper>();
        urlHelperMock
            .Setup(m => m.Content(expectedPath))
            .Returns(expectedContent)
            .Verifiable();

        var sut = new ExampleController();
        sut.Url = urlHelperMock.Object; //Set mock UrlHelper        

        //Act
        var actualContent = sut.GetContent();

        //Assert
        urlHelperMock.Verify();
        Assert.AreEqual(expectedContent, actualContent);
    }
}

Ainsi, le test peut maintenant être effectué et le framework remplira les propriétés nécessaires du contrôleur dans la production car, techniquement, rien n'a été changé du framework original aux abstractions personnalisées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X