Integrationtest .net ядро ​​с ядром EF и удостоверяющим ядром - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь внедрить автоматизированное тестирование в мой проект .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);
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...