使用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引用异常。
我认为你最好抽象出你的扩展,例如:
public interface IUrls
{
string Home();
}
public class Urls : IUrls
{
public string Home()
{
//impl
}
}
然后构造函数在任何需要的地方注入它,然后你就可以很容易地为你的测试Stub‘IUrls’。