Я пытаюсь внедрить автоматизированное тестирование в мой проект .net core 2.2. Но я не могу понять, как это сделать с включенной аутентификацией. Я где-то читал, что для тестов вы можете отключить его, но я также хочу проверить доступ. Я использую идентификацию ( не сервер) для аутентификации.
Я создал в памяти базы данных для каждого отдельного контекста (база данных по умолчанию с продуктами и личность). Мне удалось протестировать код для захвата продуктов, когда нет атрибута [Авторизовано] и к нему не привязан ни один пользователь, и мой тестовый сценарий работает. Теперь я хочу сделать это немного сложнее, задействовав оба продукта и пользователя, запрашивающего его.
Допустим, это мой упрощенный код:
Контроллер:
[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;
}
}
TestCase:
[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) войдите в систему под этим пользователем, получите cookie-файл auth, сохраните его где-нибудь и используйте для моих тестовых случаев.
3) сделать запрос с этим cookie
4) подтвердить, что у пользователя есть претензия "Продавец"
Конечно, ничего этого не должно происходить в реальной базе данных. Я создал базу данных памяти:
services.AddDbContext<MyIdentityContext>(options =>
{
options.UseInMemoryDatabase("InMemoryIdentityDbForTesting");
options.UseInternalServiceProvider(serviceProvider);
});
services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseInMemoryDatabase("InMemoryDbForTesting");
options.UseInternalServiceProvider(serviceProvider);
});