- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试创建集成测试以确保我的 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/
如果我只返回一个 View ,从 Task 返回它是否有性能差异? [HttpGet] public Task Index() { return Task.FromResult(View());
所以我用函数内部的代码替换了 Controller 函数上的 [Authorize Attribute] 并想尝试返回与属性相同的结果,这可能吗?必须做出进一步的改变? 我试图从一个返回 ViewRe
我对 SO 进行了搜索,看起来这个问题经常被问到。我已经能够让模拟工作,并且我也能够毫无问题地执行 OnActionExecuted() 。这是我的单元测试。注释行是失败的行,我确信我没有 mock
我正在 MVC 5 中创建一个测试项目。 我遇到了错误 Error 1 Cannot convert type 'System.Threading.Tasks.Task' to 'System.Web
我已经编写了这个 Controller 方法和这个测试。 Controller 方法: public async Task Metric(string type, string source) {
我在我的 ASP.NET MVC Controller 上使用自定义授权过滤器,如果用户在特定操作上的授权失败,它会将用户重定向到登录屏幕以外的 url。 这对于返回 View 的操作没有问题,但我的
ASP.NET MVC 中的 ViewResult() 和 ActionResult() 有什么区别? public ViewResult Index() { return View(); }
名为 ViewResult 的 Controller 结果和 PartialViewResult 之间有什么区别?更重要的是,什么时候使用PartialViewResult? 最佳答案 Partial
我有一个 asp.net mvc4 应用程序,当我将其发布到 azure 时,加载页面的时间太长。我安装了glimpse来检查问题出在哪里,它显示 ViewResult.ExecuteResult 是
在我的单元测试中,当我使用 View 的操作名称时,ViewResult.ViewName 属性始终为空: return View(model); or return View(); 这是设计使然吗?
我正在编写一个简单的 CMS。 我希望能够加载一个 View ,将其包含在母版页中,然后扫描 HTML 以便我可以替换一些自定义标签(例如 {{blog}} 与我自己的博客输出)然后服务由浏览器决定。
其他提到 null ViewResults 的问题实际上似乎指的是 null Models(我肯定做计划测试的东西)。我是测试新手。今天刚开始我的第一个使用 TDD 的项目。我找到的一些资源,甚至是新
public override void OnException(ExceptionContext filterContext) { string controllerName = (stri
在我的 Controller 中,我有一个 Edit GET 方法来显示 View ,还有一个 Edit POST 方法来保存更改: public ViewResult Edit(int id) {
我正在尝试创建集成测试以确保我的 View 中没有任何运行时错误。因此,我需要创建一个测试来检查 ViewResult.ExecuteResult() 是否正常工作,但我似乎遇到了麻烦。 我找到了 t
我试图在 OnActionExecuted 方法覆盖 ActionFilterAttribute 类中返回一个 ViewResult 像下面... public override void OnAct
尽管 StackOverflow 上有几篇关于 MVC 中的单元测试操作结果的帖子,但我有一个具体的问题.... 这是我在 Controller 中的 ActionResult: public Act
我制作了一个 MVC 项目,我想将模型设置为来自过滤器的 View 。 但是我不知道,我该怎么做。 模型: public class TestModel { public int ID { g
如何决定是使用 ActionResult 还是 ViewResult?我知道 ActionResult 是一个抽象类,以 ViewResult 作为子类型,但我已经看到使用这两种实现相同功能的示例。它
我正在编写一些单元测试,我有一个场景,如果条件为真, Controller 操作应该返回一个 HttpNotFoundResult,否则它应该返回一个 ViewResult 并在其中包含一个特定的模型
我是一名优秀的程序员,十分优秀!