对于 .net core 6 中的控制器调用,WebApplicationFactory 始终返回 404

2024-02-28

我按照微软的文档进行集成测试:https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-6.0#introduction-to-integration-tests https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-6.0#introduction-to-integration-tests

在.net core 6中,startup.cs已被删除,我之前使用的集成测试不再按原样工作。我需要进行更新。

在我的 API csproj 中,我添加了:

<ItemGroup>
        <InternalsVisibleTo Include="Integration.Tests" />
</ItemGroup>

这是 Integration.Tests csproj:

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <TargetFramework>net6.0</TargetFramework>
        <IsPackable>false</IsPackable>
        <IsTestProject>true</IsTestProject>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0" />
        <PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="6.0.0" />
        <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0" />
        <PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.0" />
        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
        <PackageReference Include="xunit" Version="2.4.1" />
        <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
            <PrivateAssets>all</PrivateAssets>
        </PackageReference>
        <PackageReference Include="coverlet.collector" Version="3.1.0">
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
            <PrivateAssets>all</PrivateAssets>
        </PackageReference>
    </ItemGroup>

    

</Project>

我创建了一个 TestWebAppFactory.cs,如下所示:

public class TestWebAppFactory<TEntryPoint> : WebApplicationFactory<Program> where TEntryPoint : Program
{
    public ITestOutputHelper Output { get; set; }
    public List<string> Logs { get; private set; } = new List<string>();

    public TestWebAppFactory([NotNull] ITestOutputHelper output)
    {
        Output = output;
    }

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder
            .ConfigureServices(services =>
            {
                var descriptor = services.SingleOrDefault(
                    d => d.ServiceType ==
                        typeof(DbContextOptions<MyDbContext>));

                if (descriptor != null)
                {
                    services.Remove(descriptor);
                }

                services.AddDbContext<MyDbContext>(options =>
                {
                    options.UseInMemoryDatabase("My.Sample");
                });
            })
            .Configure(app =>  {
                var serviceProvider = app.ApplicationServices;
                using var scope = serviceProvider.CreateScope();
                var itemManager = serviceProvider.GetRequiredService<IItemManager>();
                TestDbInitializer.Seed(scope.ServiceProvider, Output);
            });

    }
}

还有我的 Item_Tests.cs:

public class Items_Tests : IClassFixture<Program>
    {
        private readonly HttpClient _client;
        private readonly TestServer _server;
        private readonly IWebHost _host;

        public Items_Tests(ITestOutputHelper output)
        {
            var factory = new TestWebAppFactory<Program>(output);
            _client = factory
                .CreateClient();
        } 

        [Fact]
        public async Task Index_WhenCalled_ReturnsApplicationForm()
        {
            var response = await _client.GetAsync(Constants.Api.V1.Items.Url);

            response.EnsureSuccessStatusCode();

            var responseString = await response.Content.ReadAsStringAsync();

            Assert.Contains("Mark", responseString);
            Assert.Contains("Evelin", responseString);
        }

    }

注意:我希望能够将 ITestOuputHelper 发送到 TestWebAppFactory,以便在输出中写入一些有用的信息,但我在此不共享这些信息,以减少代码量。

注意2:当我启动 API 时,一切正常,我将在 Swagger 中查看我的控制器并使用代码 200 returnsw 调用 get。

所以每次测试失败时:

            var response = await _client.GetAsync(Constants.Api.V1.Items.Url);

            response.EnsureSuccessStatusCode();

响应总是出现 404 错误。

我应该怎么做才能使其正常工作?

Thanks


所以最后我找到了为什么当我删除时会得到 404。配置部分在测试Web应用工厂我能够连接到 API。

所以现在我需要找到如何在测试期间播种数据:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于 .net core 6 中的控制器调用,WebApplicationFactory 始终返回 404 的相关文章

随机推荐

  • 何时使用上下文处理器

    我有一个网站 其中包含一个 userBox 其中显示每个登录用户的一些数据 您的姓名 头像等 从我对 django 的了解来看 很明显 我应该将用户查询添加到上下文处理器 以便我可以使用 user 其中的变量包括 userBox 但是在使用
  • C# .First() 与 [0]

    有兴趣 做法有什么不同吗 所以 我创建了两个片段 Snippet A List
  • Java 8 自动使用多核?

    一年前 我用 java 7 做了一些关于多核的测试 首先 我仅在主线程中实现了一些计算 CPU 使用情况表明只有一个核心完成了所有工作 然后我使用 ExecutorService 实例实现了 Callable 运行时所有核心都在工作 现在
  • ASP.NET Core 相当于 ASP.NET MVC 5 的 HttpException

    在 ASP NET MVC 5 中你可以抛出一个HttpException https learn microsoft com en us dotnet api system web httpexception使用 HTTP 代码 这将设置
  • C 中二维数组声明的歧义

    我已经用以下格式定义了数组 但显然该程序仅在情况 B 中工作正常 CASE A int M1 M1 int malloc m sizeof int for int i 0 i
  • 客户端应用程序已请求访问资源“https://outlook.office365.com”。本次请求失败

    我正在尝试从office365 API测试示例代码 我可以登录到我的帐户 但之后我总是会得到这个异常 AuthenticationFailedException 被捕获 AADSTS65005 客户端应用程序已请求访问资源 https ou
  • wkhtmltopdf css 尺寸(厘米/毫米)

    我使用 wkhtmltopdf 生成 A4 大小的 PDF 当我创建一个 div 标签并将其样式设置为height 297mm width 210mm 这是A4的定义尺寸 将wkhtmltopdf的边距设置设置为0 wkhtmltopdf
  • 创建全局对象?

    我正在努力实现以下目标 当用户成功通过身份验证后 我需要创建一个可以从不同表单 或类 访问的全局用户对象 我正在查看 VS 中可用的数据源 发现有一个 对象 选项可能适合我想要实现的目标 问题是 我不知道它是如何工作的 有人能指出我正确的方
  • 无法导入 PyQt4.QtGui

    我安装了一个有效的 Python 2 6 并且刚刚安装了为 Python 2 6 构建的 PyQt4 可在http www riverbankcomputing co uk software pyqt download http www r
  • 有没有一种方法可以使用 AJAX/jQuery 上传图像而不使用 Flash 或 iframe?

    还要尽量避免使用任何插件 当然除了 jQuery 无论你是否称其为插件 我已经有一个大型系统 并且不想为其加载大量插件 当然 如果我也需要的话 我会寻找重量非常轻的东西 尝试这个 http www 9lessons info 2011 08
  • 提高访问映射中的元素和写入文件的性能

    我有一个 C 映射结构 其中包含大约 6000 万对 填充地图后 我想将其写入一个普通文件 目前这段代码非常慢 我想知道您是否对我如何加快编写速度有任何建议 我可以 1 改进在地图中访问元素的方式吗 或者2 通过加速文件写入本身 map
  • “MvxWpfSetup”必须是具有公共无参数构造函数的非抽象类型

    我正在尝试遵循该视频末尾的代码here https youtu be 8E000zu8UhQ 但我在 1 11 10 标记附近收到此错误 error CS0310 MvxWpfSetup
  • mongodb 在 commitTransaction 失败后我是否需要 abortTransaction ?

    mongoose mongodb node js 代码 session commitTransaction function err reply if err session abortTransaction Do I need this
  • 我需要对用户进行身份验证和授权的最低 ASP.NET 提供程序实现是什么?

    默认情况下 ASP NET MVC 将 AccountController 设置为使用 SqlMembershipProvider SqlProfileProvider 和 SqlRoleProvider 我真的不需要所有的东西 事实上 将
  • 使用reduce()的有用代码? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这里有人有任何在Python中使用reduce 函数的有用代码吗 除了我们在示例中看到的常见 和 之外 还有其他代码吗 Refer Python
  • Font Awesome 菜单图标有 1px 偏移

    我已经尝试解决这个问题几个小时了 并且我一直在寻找一个好的解决方案 但运气不佳 它让我发疯 摆弄填充和行高 垂直对齐它没有做任何事情 这是在另一个线程中建议的 基本上我正在尝试创建一个响应式导航菜单 当点击或单击图标时 将在菜单显示时下推页
  • 使用 libgit2 从临时索引创建树对象 - git2go

    在命令行上我可以执行以下操作 touch foo GIT INDEX FILE tmp tmp d95ehfhUOffoo index git add A GIT INDEX FILE tmp tmp d95ehfhUOffoo index
  • 在匿名类型上编写 Group By

    我正在两个表上编写一个 group by 子句 这两个表已连接并通过实体数据模型进行访问 我无法迭代匿名类型 有人可以帮助我吗 public string GetProductNameByProductId int productId st
  • 在C中将MD5结果转换为整数

    我的目标是使用 MD5 结果来索引哈希表 我想对其执行模运算以在表中找到适当的槽 我尝试将其转换为无符号 long long 类型 当我打印结果时 对于相同的 MD5 哈希值 每次都会得到不同的数字 MD5 哈希值最初是一个 unsigne
  • 对于 .net core 6 中的控制器调用,WebApplicationFactory 始终返回 404

    我按照微软的文档进行集成测试 https learn microsoft com en us aspnet core test integration tests view aspnetcore 6 0 introduction to in