如何解决无法从NUnit测试中获取index.html
我尝试使用NUnit和以Asp.net为核心的Blazor WebAssembly应用程序编写最终测试。
我用3.1.7模板创建了一个新项目。 然后,我只添加一个NUnit项目并编写简单的测试。
private const string serviceUrl = "https://localhost:50200";
private HttpClient _httpClient;
[OneTimeSetUp]
public void Init()
{
var arguments = new string[0];
var builder = Program.CreateHostBuilder(arguments);
_httpClient = new HttpClient();
builder
.ConfigureWebHostDefaults(w => w.UseUrls(serviceUrl))
.Build()
.Start();
}
[Test]
public async Task HomePageResponcesOk()
{
var requestUrl = serviceUrl;
var response = await _httpClient.GetAsync(requestUrl);
Assert.AreEqual(HttpStatusCode.OK,response.StatusCode);
}
[Test]
public async Task ApiResponcesOk()
{
var requestUrl = $"{serviceUrl}/WeatherForecast";
var response = await _httpClient.GetAsync(requestUrl);
Assert.AreEqual(HttpStatusCode.OK,response.StatusCode);
}
我什么都没改变。
我得到下一个结果
Test Duration Error Message
HomePageResponcesOk Failed 45 ms Expected: OK But was: NotFound
ApiResponcesOk Passed 364 ms
我做错了什么?
我可以指出,它在Blazor WebAssembly的早期版本中可以正常工作。
我尝试调试它。我在.UseRouting()
和.UseEndpoints
之间添加了中间件。
app.UseRouting();
app.Use(TestMiddleware);
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.MapFallbackToFile("index.html");
});
...
public Task TestMiddleware(HttpContext context,Func<Task> next)
{
var endpoint = context.GetEndpoint();
Console.WriteLine(endpoint.DisplayName);
return next();
}
端点显示名称为"Fallback {*path:nonfile}"
。这是预期的行为。如果需要答案,我可以提供其他调试信息。
我添加了另一项测试
[Test]
public async Task AppCssResponcesOk()
{
var requestUrl = $"{serviceUrl}/css/app.css";
var response = await _httpClient.GetAsync(requestUrl);
Assert.AreEqual(HttpStatusCode.OK,response.StatusCode);
}
它返回相同的结果Failed 45 ms Expected: OK But was: NotFound
。
我认为app.UseStaticFiles();
不能按我预期的那样工作。可能是真的吗?如何解决?
解决方法
根据您收到的响应,即 “未找到” ,我的第一个猜测是为获取特定文件而创建的路径可能不正确。如果要进行调试,则可能会尝试“MapFallbackToFile”函数的一些重载。需要显式路径(绝对或相对)或其他属性的对象。经过一番尝试之后,您也许可以找到相应的文件。
可以加快调试过程的另一件事是,您可以以编程方式检查当前工作目录,并以此为参考来构建所需的准确文件路径。可以使用以下命令完成此操作:
System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
一个非常普遍面临的错误是我们的程序经常在构建目录中运行(例如bin / debug / ..),而我们所需的文件(例如CSS或映像)文件不存在,因此,我们遇到了此类问题。这是解决此问题的一种方法。
,-
我已将 *.StaticWebAssets.xml 文件从
...\Server\bin\Debug\netcoreapp3.1
复制到...\NUnitTestProject1\bin\Debug\netcoreapp3.1
-
我已将
UseStaticWebAssets()
添加到后端启动代码中。builder .ConfigureWebHostDefaults(w => { w.UseUrls(serviceUrl); w.UseStaticWebAssets(); }) .Build() .Start();
所有测试都通过了。调试器显示 CompositeFileProvider
注入,其结构与后端手动启动时的结构相同...
我已经在构建事件中设置了这些文件的复制
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="copy ..\Rest\bin\$(ConfigurationName)\net5.0-windows\*.StaticWebAssets.xml .\bin\$(ConfigurationName)\net5.0-windows\*.*" />
</Target>
很遗憾,我无法实现如何在测试项目中实现自动生成 StaticWebAssets.xml。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。