c# - 如何模拟 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
}
解决方案
推荐阅读
- ruby-on-rails - 在 Rails 上使用动作邮件程序的 rask 任务中未显示图像
- bash - 在 shell 脚本或 sed 中用特殊字符替换表达式
- swift - Swift 4 + Xcode 10 编译器崩溃“SILModuleTransform”MandatoryInlining“
- c# - 如何在 WPF 中按给定百分比绘制圆形扇区?
- r - 从 R 执行批处理文件的问题
- delphi - Delphi ini文件读取
- behat - 如何使用 Behat 检查是否有水平滚动?
- camera - 在三星 Galaxy S7 上使用 nativescript-camera 插件 (^4.0.2) 拍摄的照片中没有存储一致的 EXIF 数据
- c# - 登录后重复索赔?还是期间?
- html - 角度条件运算符:执行多个语句