gpt4 book ai didi

asp.net-mvc - 单元测试 ViewEngines.Engines.FindView 的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-02 07:54:36 26 4
gpt4 key购买 nike

我最近对我的 mvc 应用程序进行了一些重构,并意识到返回了很多静态 View 。我决定创建一个 Controller ,它返回静态 View (如果存在),并在 View 不存在时抛出 404 错误,而不是让多个 Controller 的操作结果仅返回一个 View 。

public ActionResult Index(string name)
{
ViewEngineResult result = ViewEngines.Engines.FindView(ControllerContext, name, null);

if (result.View == null)
ThrowNotFound("Page does not exists.");

return View(name);
}

我的问题是单元测试的正确方法是什么?我尝试了以下代码,但收到的错误是“RouteData 必须包含一个名为“controller”且具有非空字符串值的项目”。

[Theory]
[InlineData("ContactUs")]
public void Index_should_return_view_if_view_exists(string name)
{
controller = new ContentController();
httpContext = controller.MockHttpContext("/", "~/Content/Index", "GET"); ;

var result = (ViewResult)controller.Index(name);

Assert.NotNull(result.View);
}

我的目的是让单元测试出去并获取真实的 View 。然后我开始想知道是否应该使用 FindView 的 SetupGet 模拟 ViewEngines 并创建两个测试,其中第二个测试是否在 View 为 null 时抛出未找到的异常。

测试此功能的正确方法是什么?任何指针、示例代码或博客文章都会有所帮助。

谢谢

最佳答案

您应该创建一个模拟 View 引擎并将其放入集合中:

[Theory]
[InlineData("ContactUs")]
public void Index_should_return_view_if_view_exists(string name)
{
var mockViewEngine = MockRepository.GenerateStub<IViewEngine>();
// Depending on what result you expect you could set the searched locations
// and the view if you want it to be found
var result = new ViewEngineResult(new [] { "location1", "location2" });
// Stub the FindView method
mockViewEngine
.Stub(x => x.FindView(null, null, null, false))
.IgnoreArguments()
.Return(result);
// Use the mocked view engine instead of WebForms
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(mockViewEngine);

controller = new ContentController();

var actual = (ViewResult)controller.Index(name);

Assert.NotNull(actual.View);
}

关于asp.net-mvc - 单元测试 ViewEngines.Engines.FindView 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3375642/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com