ASP.NET 5 - MVC 6 - 单元测试使用Url.Action的Controller

ret*_*vek 3 c# asp.net-mvc unit-testing

我有一个MVC6控制器,代码如下:

string link = Url.Action("Profile", "Account");
Run Code Online (Sandbox Code Playgroud)

当我对该控制器进行单元测试时,该行失败并显示错误:

Value cannot be null.
Parameter name: helper
Run Code Online (Sandbox Code Playgroud)

我真的不想模仿Url.Action响应加上我认为我不能,因为它是一个扩展方法(静态方法).我想让它像在Web环境中一样运行和返回.

在单元测试中实例化控制器时我需要做什么才能使上面的行按预期执行?

我看到我可以在单元测试中做到这样的事情:

controller.Url = new UrlHelper(new ActionContextAccessor(), new DefaultActionSelector(...));
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚设置ActionContextAccessor和/或DefaultActionSelector需要什么(它需要更多类型,我不知道在哪里获取或如何实例化).

有没有人这样做过?

谢谢,凯文

ret*_*vek 5

当我被困住时,我的妻子总是告诉我只是"离开"一个问题.她几乎总是对的.

在意识到上面的解决方案无法工作之后(因为它是MVC5),我又看了一眼并意识到controller.Url只是IUrlHelper的一个实例.我嘲笑这一点,测试开始工作.这是我正在做的事情的要点.这使得测试能够执行.我确信我可以在模拟中添加更多内容以实际验证它是否按预期运行.

        Mock<IUrlHelper> urlHelperMock = new Mock<IUrlHelper>();
        var controller = new BooksController();
        controller.Url = urlHelperMock.Object;
Run Code Online (Sandbox Code Playgroud)

是的,这很容易LOL.

谢谢,凯文