Проверка авторизации asp.net core в тестах

108
16 июля 2019, 14:10

Допустим, я создал пустое приложение asp.net core 2.1 и добавил [Authorize] на экшн About.

Как мне в юнит-тестах проверить, что страница Index отдаётся незалогиненным пользователям, а страница About стала требовать авторизацию?

Answer 1

Для того, чтобы проверить что страница доступна под незалогиненным пользователем достаточно убедиться, что код ответа будет 2хх:

[TestFixture]
public class HomeControllerTest
{
    public HomeControllerTest()
    {
        this._factory = new CustomWebApplicationFactory<Startup>();
    }
    private readonly WebApplicationFactory<Startup> _factory;
    [Test]
    public async Task IndexPage_ForNonLoggedUser_ReturnsPageContent()
    {
        // Arrange
        var client = this._factory.CreateClient();
        // Act
        var response = await client.GetAsync("/");
        // Assert
        response.EnsureSuccessStatusCode(); // Status Code 200-299
    }
}

А вот проверка того, что страница доступна под авторизованным пользователем более сложная: необходим в клиенте выключить автоматический переход по редиректам и проверить, что нас редиректит на страницу авторизации.

[Test]
public async Task AboutPage_ForNonLoggedUser_RedirectsToLoginPages()
{
    // Arrange
    var client = this._factory.CreateClient(
        new WebApplicationFactoryClientOptions
        {
            AllowAutoRedirect = false
        });
    // Act
    var response = await client.GetAsync("/Home/About");
    // Assert
    Assert.AreEqual(HttpStatusCode.Redirect, response.StatusCode);
    StringAssert.StartsWith("http://localhost/Identity/Account/Login", response.Headers.Location.OriginalString);
}

(Я видел в сети примеры, в которых проверялся ответ 403, возможно это работало для более ранних версий asp.net core, у меня на 2.1 требуется именно проверка редиректа)

Ровно такие же тесты необходимы и для Razor Page, в них нет ничего отличного от подобных проверок.

В принципе, подробное описание есть в документации, а также там приведена ссылка на тестовое приложение с xUnit.

READ ALSO
Менеджемент enum, или чистка кода

Менеджемент enum, или чистка кода

Поделитесь опытом, кто что использует для чистки enum? Со временем, обычно накапливается много значений, часть из которых уже отсутствуют в кодеОсобенно...

100
Как правильно применить Sphinx

Как правильно применить Sphinx

У меня есть такой запрос

135
Как сформировать данные WooCommerce?

Как сформировать данные WooCommerce?

Есть вот такие данные:

125
Как реализовать авто создание Subdomain?

Как реализовать авто создание Subdomain?

Я пишу CMS, мне нужно реализовать авто создание subdomain и директорию к ней

126