在我的简单 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/