我正在尝试对.net core 2.2项目实施自动化测试。但是我不知道如何启用身份验证。我在某处读到可以进行测试的测试,可以将其禁用,但是我也想测试访问权限。我使用身份(非服务器)进行身份验证。
我在内存数据库中为每个单独的上下文创建了数据库(带有产品和标识的默认数据库)。当没有[Authorized]属性并且没有用户绑定到我的测试用例时,我设法测试了获取产品的代码。现在,我想通过涉及这两种产品以及用户的要求使其变得更加复杂。
让我们说这是我的简化代码:
控制器:
[Route("test")]
public class TestController : Controller
{
private readonly UserManager<User> userManager;
public TestController(UserManager<User> _usermanager)
{
usermanager = _usermanager;
}
[HttpGet("[action]")]
[Authorized(Policy = "Seller")]
public List<Product> GetAllProductsFromUser()
{
User user = await userManager.GetUserAsync(HttpContext.User);
List<Product> products = db.Products.Where(x => x.userId == user.userId).ToList();
return products;
}
}
测试用例:
[Fact]
public async Task Testcase()
{
// Arrange
//Setup a user and get their auth cookie??
//Act
//add the auth cookie to the request
var response = await _client.GetAsync("/test/GetAllProductsFromUser");
response.EnsureSuccessStatusCode();
// Assert
var stringResponse = await response.Content.ReadAsStringAsync();
var products= JsonConvert.DeserializeObject<List<Product>>(stringResponse);
Assert.Equal(3, products.Count);
}
我发现了如何使用一些有关产品的信息来填充数据库。我还没找到方法:
1)从usermanager创建用户;
2)以该用户身份登录,检索auth cookie,将其存储在某个地方,并将其用于我的测试用例。
3)使用该Cookie发出请求
4)验证用户是否具有“卖方”声明
当然,这一切都不应该在实际数据库中发生。我创建了一个内存数据库:
services.AddDbContext<MyIdentityContext>(options =>
{
options.UseInMemoryDatabase("InMemoryIdentityDbForTesting");
options.UseInternalServiceProvider(serviceProvider);
});
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseInMemoryDatabase("InMemoryDbForTesting");
options.UseInternalServiceProvider(serviceProvider);
});