我正在为大学项目编写一个Razor Pages应用程序,我需要对其进行测试。我在线测试Razor页面时找不到很多来源和示例,我试图按照此链接中的示例进行操作: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;
});
}
但我似乎找不到在我的测试中配置它的方法。
我的第二个问题是集成测试:
我正在尝试使用Test Server运行一个非常基本的测试,这是我的测试类:
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类,我所做的就是将我的服务添加到配置方法中(正如我之前所说,我使用的是会话对象以及我的app中的WebSocketManager。)
_client.GetAsync(“/”)返回状态“500 - 内部服务器错误”,我不知道为什么以及如何配置这些测试工作。
任何想法将不胜感激,谢谢。