Тестирование бритвенных страниц - PullRequest
0 голосов
/ 27 апреля 2018

Я пишу приложение Razor Pages для университетского проекта, который я должен протестировать. Я не смог найти много источников и примеров в сети по тестированию Razor Pages, и я пытаюсь следовать примерам по этой ссылке: https://docs.microsoft.com/en-us/aspnet/core/testing/razor-pages-testing?view=aspnetcore-2.1

Моя первая проблема - модульное тестирование:
Это тестовый метод, который я написал, он должен проверить, что значение, заполненное методом OnGet в моей модели, получает правильное значение:

[Fact]
    public void OnGet_ViewStores()
    {
        // Arrange
        var httpContext = new DefaultHttpContext();
        var modelState = new ModelStateDictionary();
        var actionContext = new ActionContext(httpContext, new RouteData(), new PageActionDescriptor(), modelState);
        var modelMetadataProvider = new EmptyModelMetadataProvider();
        var viewData = new ViewDataDictionary(modelMetadataProvider, modelState);
        var pageContext = new PageContext(actionContext)
        {
            ViewData = viewData
        };
        var storesModel = new StoresModel()
        {
            PageContext = pageContext,
            Url = new UrlHelper(actionContext)
        };

        #region snippet2
        // Act
        storesModel.OnGet();
        #endregion

        #region snippet3
        // Assert
        var actualStores = wsep1.Services.ViewAllStores(1);
        Assert.Equal(storesModel.StoreDetails, actualStores);
        #endregion
    }

А это проверяемая модель:

public class StoresModel : PageModel
{
    public List<string> StoreDetails { get; set; }
    public string Message { get; set; }
    public int clientId;

    public void OnGet()
    {
        clientId = (int)HttpContext.Session.GetInt32("clientId");
        Message = "Your clientId id is " + clientId;
        StoreDetails = wsep1.Services.ViewAllStores(clientId);
    }
}

Проблема в том, что тест выдает исключение, потому что я использую HttpContext.Session, который не настраивается должным образом в тесте. В моем реальном проекте он предварительно настроен в Startup.cs следующим образом:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddWebSocketManager();
        services.AddMvc();
        services.AddDistributedMemoryCache();
        services.AddTransient<ShoppingHandler>();
        services.AddSession(options =>
        {
            // Set a short timeout for easy testing.
            options.IdleTimeout = TimeSpan.FromSeconds(1000);
            options.Cookie.HttpOnly = true;
        });
    }

Но я не могу найти способ настроить это в моем тесте.

Моя вторая проблема с интеграционным тестированием:
Я пытаюсь выполнить очень простой тест на тестовом сервере, это мой тестовый класс:

   public class IndexPageTest : IClassFixture<TestFixture<Client.Startup>>
{
    private readonly HttpClient _client;

    public IndexPageTest(TestFixture<Client.Startup> fixture)
    {
        _client = fixture.Client;
    }

    #region snippet1
    [Fact]
    public async Task Request_ReturnsSuccess()
    {
        // Act
        var response = await _client.GetAsync("/");

        // Assert
        response.EnsureSuccessStatusCode();
    }
    #endregion
}  

Я едва изменил класс TextFixture, который был включен в демонстрационный проект по ссылке, которую я дал в начале поста, все, что я сделал, это добавил свои сервисы в метод конфигурации (как я уже говорил, я использую Объект сеанса, а также WebSocketManager в моем приложении).
_client.GetAsync ("/") возвращает состояние "500 - внутренняя ошибка сервера", и я понятия не имею, почему и как настроить эти тесты для работы.
Любые идеи будут оценены, спасибо.

...