ASP.NET核心单元测试授权

时间:2017-01-18 23:07:06

标签: unit-testing asp.net-core authorization

我尝试创建单元测试我的授权逻辑,但是测试有问题

  await this.HttpContext.Authentication.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme)));

我有错误

  

没有配置身份验证处理程序来处理该方案:Cookies

因为他需要CookieAuthenticationOptions

但是我不知道单元测试的配置如何

    private static Mock<SignInManager<User>> GetSignInManagerMock(Mock<UserManager<User>> userManagerMock)
    {
        var context = new Mock<HttpContext>();
        var contextAccessor = new Mock<IHttpContextAccessor>();
        contextAccessor.Setup(x => x.HttpContext).Returns(context.Object);

        return new Mock<SignInManager<User>>(userManagerMock.Object,
            contextAccessor.Object,
            new Mock<IUserClaimsPrincipalFactory<User>>().Object,
            new Mock<IOptions<IdentityOptions>>().Object,
            new Mock<ILogger<SignInManager<User>>>().Object);
    }

    private static Mock<UserManager<User>> GetUserManagerMock()
    {
        return new Mock<UserManager<User>>(new Mock<IUserStore<User>>().Object,
            new Mock<IOptions<IdentityOptions>>().Object,
            new Mock<IPasswordHasher<User>>().Object,
            new IUserValidator<User>[0],
            new IPasswordValidator<User>[0],
            new Mock<ILookupNormalizer>().Object,
            new Mock<IdentityErrorDescriber>().Object,
            new Mock<IServiceProvider>().Object,
            new Mock<ILogger<UserManager<User>>>().Object);
    }

    [Fact]
    public async void Login_Corect_input_login_password_should_return_ok()
    {
        var stamp = Guid.NewGuid().ToString();
        var user = new User
        {
            UserName = _fakeUserModel.UserName,
            Email = _fakeUserModel.Email,
            FirtName = _fakeUserModel.FirstName,
            LastName = _fakeUserModel.LastName,
            UserPicture = _fakeUserModel.UserPicture,
            ConcurrencyStamp = stamp
        };

        var userManagerMock = GetUserManagerMock();
        userManagerMock.Setup(s => s.FindByNameAsync(FakeData.UserName)).ReturnsAsync(user);

        userManagerMock.Setup(s => s.GetRolesAsync(user)).ReturnsAsync(FakeData.Roles);

        var signInManagerMock = GetSignInManagerMock(userManagerMock);
        signInManagerMock.Setup(
                s =>
                    s.PasswordSignInAsync(_fakeCorrectloginModel.UserName, _fakeCorrectloginModel.Password, false,
                        false))
            .ReturnsAsync(Microsoft.AspNetCore.Identity.SignInResult.Success);

        var controller = ControllerFactory.CreateFakeController<UserController>(false, userManagerMock.Object,
            signInManagerMock.Object);
        var response = await controller.Login(_fakeCorrectloginModel);
        var result = Assert.IsType<JsonResult>(response);
        var getModel = Assert.IsType<UserViewModel>(result.Value);

        Assert.Equal(_fakeUserModel, getModel);
    }



public static class ControllerFactory
    {
        public static T CreateFakeController<T>(bool isLoggedIn, params object[] arg) where T : Controller
        {
            var fakePrincipal = GetPrincipalMock(isLoggedIn).Object;

            var fakeActionContext = new ActionContext
            {
                HttpContext = new DefaultHttpContext
                {
                    User = fakePrincipal
                },
                ActionDescriptor = new ControllerActionDescriptor(),
                RouteData = new RouteData()
            };

            var controller = (T)Activator.CreateInstance(typeof(T), arg);
            controller.ControllerContext = new ControllerContext(fakeActionContext);

            return controller;
        }

        public static Mock<ClaimsPrincipal> GetPrincipalMock(bool isLoggedIn)
        {
            var principalMock = new Mock<ClaimsPrincipal>();
            principalMock.Setup(sg => sg.Identity).Returns(GetIdentityMock(isLoggedIn).Object);
            principalMock.Setup(s => s.IsInRole(It.IsAny<string>())).Returns(false);
            principalMock.Setup(s => s.Claims).Returns(new List<Claim>
            {
                GetClaim(HelpClaimTypes.Language, "ua")
            });
            return principalMock;
        }

        public static Mock<ClaimsIdentity> GetIdentityMock(bool isLoggedIn)
        {
            var identityMock = new Mock<ClaimsIdentity>();
            identityMock.Setup(sg => sg.AuthenticationType).Returns(isLoggedIn ? FakeData.AuthenticationType : null);
            identityMock.Setup(sg => sg.IsAuthenticated).Returns(isLoggedIn);
            identityMock.Setup(sg => sg.Name).Returns(isLoggedIn ? FakeData.UserName : null);
            return identityMock;
        }

        public static ClaimsIdentity GetClaimsIdentity(params Claim[] claims)
        {
            var identityMock = new ClaimsIdentity(claims);
            return identityMock;
        }

        public static Claim GetClaim(string type, string value)
        {
            return new Claim(type, value);
        }
    }

0 个答案:

没有答案