Csharp/C#教程:如何模拟HttpContext.User分享


如何模拟HttpContext.User

我正在开发一个Asp.net MVC 5项目,我正在尝试设置一个模拟以在控制器中返回自定义主体。 我有搜索并尝试了不同的方法,但没有一个有效。

我有一个BaseController,我的所有控制器都inheritance自。 BaseController有一个User属性,它在getter中返回HttpContext.User。 HttpContext.user在项目中调用时返回一个值,但在从unit testing项目调用时返回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(new UnitOfWork(_context)) { CallBase = true }; _mockController.Setup(u => u.User).Returns(principal); *** 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(); //...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

应通过dependency injection将IUserProvider传递给控制器​​。

上述就是C#学习教程:如何模拟HttpContext.User分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/955941.html

(0)
上一篇 2021年11月22日
下一篇 2021年11月22日

精彩推荐