无法从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或映像)文件不存在,因此,我们遇到了此类问题。这是解决此问题的一种方法。

,
  1. 我已将 *.StaticWebAssets.xml 文件从 ...\Server\bin\Debug\netcoreapp3.1 复制到 ...\NUnitTestProject1\bin\Debug\netcoreapp3.1

  2. 我已将 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。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...