gpt4 book ai didi

c# - 我怎样才能正确地模拟我的 controllercontext 来测试 ViewResult.ExecuteResult()?

转载 作者:太空狗 更新时间:2023-10-29 21:41:40 28 4
gpt4 key购买 nike

我正在尝试创建集成测试以确保我的 View 中没有任何运行时错误。因此,我需要创建一个测试来检查 ViewResult.ExecuteResult() 是否正常工作,但我似乎遇到了麻烦。

我找到了 this site这给了我一个起点,我有以下代码:

    [TestMethod]
public void RegisterResultExecutes()
{
//arrange
RequestContext requestContext = new RequestContext(new MockHttpContext(), new RouteData());
AccountController controller = new AccountController
{
FormsService = new MockFormsAuthenticationService(),
MembershipService = new MockMembershipService(),
Url = new UrlHelper(requestContext)
};

var result = controller.Register();
var sb = new StringBuilder();
Mock<HttpResponseBase> response = new Mock<HttpResponseBase>();
response.Setup(x => x.Write(It.IsAny<string>())).Callback<string>(y =>
{
sb.Append(y);
});
Mock<ControllerContext> controllerContext = new Mock<ControllerContext>();
controllerContext.Setup(x => x.HttpContext.Response).Returns(response.Object);

//act
result.ExecuteResult(controllerContext.Object);
}

问题是当 result.ExecuteResult() 被调用时我得到以下异常

System.NullReferenceException: Object reference not set to an instance of an object.

System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
MyApp.Tests.Controllers.AccountControllerTest.RegisterResultExecutes() in C:\Users\KallDrexx\Documents\Projects\MyApp\MyApp.Tests\Controllers\AccountControllerTests.cs: line 297

不幸的是,该堆栈跟踪不是很有用,因为我不确定它试图访问的内容是空的。有人对我如何为 ExecuteResult() 创建测试有什么建议吗?

最佳答案

根据堆栈跟踪,是 ViewResultBase.ExecuteResult 方法中的某些内容引发了异常。使用反射器,这里是该方法的定义:

public override void ExecuteResult(ControllerContext context)
{
if (context == null)
{
throw new ArgumentNullException("context");
}
if (string.IsNullOrEmpty(this.ViewName))
{
this.ViewName = context.RouteData.GetRequiredString("action");
}
ViewEngineResult result = null;
if (this.View == null)
{
result = this.FindView(context);
this.View = result.View;
}
TextWriter output = context.HttpContext.Response.Output;
ViewContext viewContext = new ViewContext(context, this.View, this.ViewData, this.TempData, output);
this.View.Render(viewContext, output);
if (result != null)
{
result.ViewEngine.ReleaseView(context, this.View);
}
}

基于该代码,当代码尝试从上下文访问 RouteData 属性时,可能会抛出对象引用异常(如果 View 的名称未明确指定给返回类型).

可以通过访问 HttpContext 属性抛出异常。我还没有很好地使用 Moq 来知道它是否可以处理你没有告诉它如何模拟 HttpContext 属性的事实,但你已经告诉它如何模拟 Response 属性来自 HttpContext 属性的类型,所以这是我怀疑的另一个方面。

该方法中上下文的所有其他使用都将其传递给其他方法,如果这些是问题所在,那么堆栈跟踪就会揭示这一点。

查看我提到的两个中哪一个是问题的最简单方法是,我会编写一个快速测试以从您的模拟中提取这些属性,并查看是哪个导致了异常。

关于c# - 我怎样才能正确地模拟我的 controllercontext 来测试 ViewResult.ExecuteResult()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6025605/

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