【问题标题】:ASP MVC Unit Testing GetUserId()ASP MVC 单元测试 GetUserId()
【发布时间】:2015-11-25 10:53:36
【问题描述】:

我有一个控制器,我在其中调用 userId:

var userId = User.Identity.GetUserId();

这使我的单元测试失败,因为 User 为空。 我尝试使用此方法在测试方法中设置用户,但是当测试运行时,控制器中的用户仍然为空。

var context = new Mock<HttpContextBase>();
var mockIdentity = new Mock<IIdentity>();
context.SetupGet(x => x.User.Identity).Returns(mockIdentity.Object);
mockIdentity.Setup(u => u.Name).Returns("test_userName");

关于我做错了什么的任何提示?

【问题讨论】:

    标签: c# asp.net-mvc unit-testing


    【解决方案1】:

    HttpContextBase.UserIPrincipal 类型,你没有嘲笑它。这就是为什么在测试中访问它时它返回 null 的原因。您可以按如下方式模拟它

    var controllerContext = new Mock<ControllerContext>();
    var principal = new Moq.Mock<IPrincipal>();
    principal.Setup(p => p.IsInRole("Administrator")).Returns(true);
    principal.SetupGet(x => x.Identity.Name).Returns(userName);
    controllerContext.SetupGet(x => x.HttpContext.User).Returns(principal.Object);
    controller.ControllerContext = controllerContext.Object;
    

    这是这段代码的reference

    【讨论】:

      【解决方案2】:

      好的,所以根据this的帖子,你可以这样做:

      public class MyController: Controller
      {
          public Func<string> GetUserId; //For testing
      
          public MyController()
          {
              GetUserId = () => User.Identity.GetUserId();
          }
          //controller actions
      }
      

      然后,当您需要用户时,无需调用 User.Identity.GetUserId(),而是调用 GetUserId() 并在测试中模拟出用户 ID:

      controller = new MyController()
      {
          GetUserId = () => "IdOfYourChoosing"
      };
      

      【讨论】:

        【解决方案3】:

        您正在模拟 HttpContextBase 但没有将其传递给您的控制器。 试试这个模式:

        类:

            public MyClass
            {
                private readonly HttpContextBase _contextBase;
        
                public MyClass(HttpContextBase contextBase)
                {
                    this._contextBase = contextBase;
                }
        
                public void Process()
                {
                    var userId = _contextBase.User.Identity;
                }
            }
        

        测试:

            [Test]
            public void MyClass_Test_SO()
            {
                // arrange
                var context = new Mock<HttpContextBase>();
                var mockIdentity = new Mock<IIdentity>();
                context.SetupGet(x => x.User.Identity).Returns(mockIdentity.Object);
                mockIdentity.Setup(u => u.Name).Returns("test_userName");
                var sut = new MyClass(context.Object);
        
                // act
                sut.Process();
        
                // assert
                // ... whatever
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-25
          • 1970-01-01
          相关资源
          最近更新 更多