![](/img/trans.png)
[英]Mock an extension method on the ClaimsPrincipal class for use within HttpContext.User
[英]How to mock HttpContext.User
我正在开发一个Asp.net MVC 5项目,我正在尝试设置一个模拟以在控制器中返回自定义主体。 我有搜索并尝试了不同的方法,但没有一个有效。
我有一个BaseController,我的所有控制器都继承自。 BaseController有一个User属性,它在getter中返回HttpContext.User。 HttpContext.user在项目中调用时返回一个值,但在从单元测试项目调用时返回null。
BaseController
public class BaseController : Controller
{
protected virtual new CustomPrincipal User
{
get { return HttpContext.User as CustomPrincipal; } ***<== Line with issue***
}
}
自定义校长
public class CustomPrincipal : IPrincipal, ICustomPrincipal
{
public IIdentity Identity { get; private set; }
public string UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsStoreUser { get; set; }
public CustomPrincipal(string username)
{
this.Identity = new GenericIdentity(username);
}
}
调节器
public class DocumentsController : BaseController
{
public ViewResult ViewDocuments()
{
var userType = User.IsStoreUser ? UserType.StoreUser : UserType.Corporate; ***<== User is null when calling from a unit test.***
}
}
测试用例
[Test]
public void ViewDocuments_WhenCalled_ShouldReturnViewModel()
{
// Arrange
var principal = new CustomPrincipal("2038786");
principal.UserId = "2038786";
principal.FirstName = "Test";
principal.LastName = "User";
principal.IsStoreUser = true;
var _mockController = new Mock<DocumentsController>(new UnitOfWork(_context)) { CallBase = true };
_mockController.Setup(u => u.User).Returns(principal); ***<== Error - "Invalid setup on a non-virtual (overridable in VB) member: u => u.User"***
// Act
var result = _controller.ViewDocuments();
}
我正在使用nUnit和Moq来创建模拟对象,但我不确定我做错了什么。 我需要在DocumentControl中模拟User.IsStore的返回,以在我在测试中创建的自定义主体对象中返回IsStore的值。
制作一个模拟的http上下文
private class MockHttpContext : HttpContextBase {
private readonly IPrincipal user;
public MockHttpContext(IPrincipal principal) {
this.user = principal;
}
public override IPrincipal User {
get {
return user;
}
set {
base.User = value;
}
}
}
相应地安排测试。
[Test]
public void ViewDocuments_WhenCalled_ShouldReturnViewModel() {
// Arrange
var principal = new CustomPrincipal("2038786");
principal.UserId = "2038786";
principal.FirstName = "Test";
principal.LastName = "User";
principal.IsStoreUser = true;
var mockUoW = new Mock<IUnitOfWork>();
//...setup UoW dependency if needed
var controller = new DocumentsController(mockUoW.Object);
controller.ControllerContext = new ControllerContext {
Controller = controller,
HttpContext = new MockHttpContext(principal)
};
// Act
var result = controller.ViewDocuments();
//Assert
//...assertions
}
不要模拟被测系统。 嘲笑它的依赖。
如果你不直接依赖HttpContext
它会变得容易多了。 创建一个IUserProvider
接口和一个依赖于HttpContext
的实现(例如HttpContextUserProvider
),然后在测试中存根IUserProvider
。
应通过依赖注入将IUserProvider
传递给控制器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.