Я пишу приложение 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 - внутренняя ошибка сервера", и я понятия не имею, почему и как настроить эти тесты для работы.
Любые идеи будут оценены, спасибо.