使用Url扩展的单元测试控制器

本文关键字:单元测试 控制器 扩展 Url 使用 | 更新日期: 2023-09-27 18:20:23

我最近更改了大多数控制器,使其使用Url帮助程序扩展,而不是使用RedirectToAction等:

public ActionResult Create(CreateModel model)
{
    // ...
    return Redirect(Url.Home());
}

这使得我的单元测试目前出现了NullReference异常。模拟/存根UrlHelper的正确方法是什么,这样我就可以让我的单元测试重新工作?

编辑:

我的Url扩展名如下:

public static class UrlHelperExtensions
{
    public static string Home(this UrlHelper helper)
    {
        return helper.RouteUrl("Default");
    }
}

我的单元测试只是为了确保它们被重定向到正确的页面:

// Arrange
var controller = new HomeController();
// Act
var result = controller.Create(...);
// Assert
// recalling the exact details of this from memory, but this is what i'm trying to do:
Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
Assert.AreEqual(((RedirectToRouteResult)result).Controller, "Home");
Assert.AreEqual(((RedirectToRouteResult)result).Action, "Index");

现在发生的情况是,当我调用Url.Home()时,却得到了一个nullreference错误。我尝试用一个新的UrlHelper设置Url属性,但它仍然得到一个null引用异常。

使用Url扩展的单元测试控制器

我认为你最好抽象出你的扩展,例如:

public interface IUrls
{
   string Home();
}
public class Urls : IUrls
{
   public string Home()
   {
       //impl
   }
}

然后构造函数在任何需要的地方注入它,然后你就可以很容易地为你的测试Stub‘IUrls’。