如何在使用moq和nunit测试web api控制器时模拟用户身份?

时间:2017-03-02 04:54:09

标签: c# asp.net-web-api2 moq

我想测试用户身份设置的Web服务调用(假装用户已登录)

我查了很多帖子和stackoverflow的答案,但我没有得到我想要的答案。

我最接近的是这个。

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

此时,我认为我必须设置controllercontext,并且需要以某种方式提供上下文变量。

我见过很多关于MVC控制器的例子,但我找不到适用于ApiController的例子。有人可以对此有所了解吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

这就是我为我的项目所做的事情: 对于ASP.NET Web Api

this._userController.User = new ClaimsPrincipal(
                new ClaimsIdentity(
                    new List<Claim>
                    {
                        new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", "1234"),
                        new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress", "Test@test.com"),
                        new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", "live.com#Test@test.com")
                    })
                );

这是针对.net core web api:

var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
            {
                 new Claim(ClaimTypes.NameIdentifier, "testId"),
                 new Claim(ClaimTypes.Name, "testName")
            }));

        this.controller.ControllerContext = new Microsoft.AspNetCore.Mvc.ControllerContext()
        {
            HttpContext = new DefaultHttpContext() { User = user }
        };

让我知道它是否有帮助。

答案 1 :(得分:1)

Awww,这很简单。

var identity = new GenericIdentity("bcd");

Controller.User = new GenericPrincipal(identity, null);

原来这部分并不需要模拟用户,你只需要设置你正在呼叫的控制器的用户ID。