c# - 当我模拟我的 ASP.NET MVC Controller 时,我的 ActionMethod 不返回任何 View 。为什么?

标签 c# .net asp.net-mvc-3 mocking moq

在我的简单 Index() ActionMethod 中,我引用了 User.Identity 属性。所以,我认为我需要 mock 它。

所以我创建了一些模拟 HomeController 并在我的单元测试中使用它。当我这样做时,ActionMethod 返回 null 作为 View 。当我用具体实例替换模拟 Controller 时(当然注释掉对 User.Identity 的任何引用),然后返回正确的 View 。

例如。

// Arrange.
var homeController = Mock<HomeController>(..);
homeController.Setup(x => x.User).Returns(new GenericPrincipal(..));

// Act.
var result = homeController.Index();

// Assert.
Assert.IsNotNull(result); // This fails here. result is NULL.

但是当我这样做(并注释掉任何 User 引用)时,它有效...

// Arrange.
var homeController = new HomeController(..);

// Act.
var result = homeController.Index();

// Assert.
Assert.IsNotNull(result); // Tick!

知道这是为什么吗?

最佳答案

你的单元测试中有一些奇怪的东西。您正在对 Controller 进行单元测试,但您正在模拟被测对象的创建:var homeController = Mock<HomeController>(..);这是不正确的。

以下是将模拟用户注入(inject)您愿意进行单元测试的 Controller 的正确方法:

// arrange
var sut = new HomeController();
var user = new GenericPrincipal(new GenericIdentity("foo"), null);
var httpContext = new Mock<HttpContextBase>();
httpContext.Setup(x => x.User).Returns(user);
var context = new ControllerContext(new RequestContext(httpContext.Object, new RouteData()), sut);
sut.ControllerContext = context;

// act
var actual = sut.Index();

// assert
...

关于c# - 当我模拟我的 ASP.NET MVC Controller 时,我的 ActionMethod 不返回任何 View 。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7874574/

相关文章:

c# - SQL 索引表连接

c# - 隐藏 TableLayoutPanel 中两个组合单元格之间的边框

c# - 读取使用 FileUpload 控件上传的 Excel 文件而不将其保存在服务器上

.net - 如何从 postgresql 数据库生成 edmx

c# - 来自带有微软表达式编码器的屏幕截图的实时流

c# - 有没有办法跨多行跨越长方法名称?

asp.net-mvc-3 - 避免服务器端 Razor View 和客户端 jQuery 模板之间的重复格式

c# - 如何从 jQuery 自动完成的 C# Controller 操作返回 Json 标签/值对

c# - Asp.net Core 2 API POST 对象为 NULL?

c# - 使用 LINQ Min() 获取对象?