UrlHelper类在Asp.net mvc中抛出空异常

3
我正在开发一个Asp.net mvc Web应用程序,正在对我的应用程序进行单元测试。我正在使用Moq来模拟对象。我尝试模拟Url助手类。我找到了这个链接-asp.net mvc:如何模拟Url.Content(“〜”)?。使用该类,我可以在单元测试中模拟UrlHelper类。
我创建了一个名为BaseController的类。
public class BaseController : Controller
{
    private IUrlHelper _urlHelper;

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

这里是IUrlHelper接口/抽象类

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);
}

我会像这样在单元测试中模拟Url.Content()

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

测试运行成功且正常工作。问题是我无法在实时应用程序中使用它。我的意思是,当我运行我的应用程序并调用Url.Content("path")时,它会抛出空异常。

例如:

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

在这段代码中,Url.Content 抛出了空异常。在单元测试中它运行良好。我该如何修复这个代码?

这个例子展示了如何模拟接口进行测试,但没有展示它在生产代码中的实现方式。很可能没有进行生产实现,因此在实际执行时为空。 - Nkosi
1个回答

5
在这种情况下,实际上没有必要对UrlHelper进行抽象化。只需在测试中模拟助手以执行所需操作即可。
例如,假设...
public class ExampleController : Controller {
    public string GetContent() {
       return Url.Content("~/Path/To/File");
    }
}

这里有一个使用Moq模拟UrlHelper的测试,使其像原始示例一样工作。

[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);
    }
}

现在可以进行测试,而且由于从原始框架到自定义抽象实际上没有任何更改,因此生产中的框架将填充必要的控制器属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接