首页 > 解决方案 > 如何模拟 ClaimsPrincipal 进行单元测试

问题描述

我有产品控制器和发布方法来创建数据并保存在数据库中,我需要ClaimsPrincipal检查系统中的用户并检查用户角色,但是当我编写单元测试时我有问题如何模拟ClaimsPrincipal,顺便说一句授权我使用 jwt Bearer 令牌. 抱歉,这只是测试项目,我无法展示真实项目。

[Authorize]
[ApiController]
[Route("api/{controller}")]
public class ProductsContoller : ControllerBase
{   
    private readonly IProductsRepository _products;
    public ProductsContoller(IProductsRepository products)
    {
        _products = products;
    }

    [Authorize(Roles = "root, admin, user")]
    [HttpPost]
    public async Task<IActionResult> Create([FromBody] Product product)
    {
        var result = await _products.CreateAsync(User, product);
        return Ok(result);
    }
}

在产品存储库中,我使用声明检查用户:

public interface IProductsRepository
{
    Task<Product> CreateAsync(ClaimsPrincipal userClaims, Product product);
}

public class ProductsRepository
{
    private readonly UserManager<IdentityUser> _usermanager;
    private readonly AppDbContext _db;

    public ProductsRepository(AppDbContext db, UserManager<IdentityUser> usermanager)
    {
        _db = db;
    }

    public async Task<Product> CreateAsync(ClaimsPrincipal userClaims, Product product)
    {
        var user = await _usermanager.GetUserAsync(userClaims);
        if(user is null)
        {
            return null;
        }

        var userRole = await _usermanager.GetRolesAsync(user);
        if (userRole is null || userRole.Count == 0 || userRole[0] is null)
        {
            return null;
        }

        //Check deal and add to database
        await _db.Products.Add(product);
        await _db.SaveChangesAsync();

        return product;            
    }

}

我试图编写单元测试:

[Fact]
public void Test1()
{   
    //Arrange
    var claims = new Mock<ClaimsPrincipal>();
    var p = new Product()
    {
        Id = 1,
        Name = "Test",
    };

    var mockRepo = new Mock<Test.Controllers.Repositories.IProductsRepository>();
    mockRepo.Setup(repo => repo.CreateAsync(claims.Object, Product))
        .Returns(Task.CompletedTask);
    var controller = new ProductsConrtoller(mockRepo.Object);

    //Act
    var result = controller.CreateAsync(claims, p);

    //Assert
}

标签: c#unit-testingasp.net-corexunit

解决方案


推荐阅读