Net Core集成测试:从其他程序运行Startup.cs和配置

2024-01-07

我们正在创建一个集成单元测试 (Xunit),它调用 Real Application Startup.cs。

由于某种原因,真实项目可以正确读取配置文件/属性,但是从集成测试运行它,它无法读取它。它没有将任何内容放入下面的配置(conf)变量中。我该如何解决这个问题? 原因是它没有读取是因为它没有读取 Net Core 2.2 中新的内部依赖注入,它读取配置文件。尝试立即使用 .CreateDefaultBuilder。

集成测试1.cs

        TestServer _server = new TestServer(new WebHostBuilder() .UseContentRoot("C:\\RealProject\\RealProject.WebAPI")
            .UseEnvironment("Development")
            .UseConfiguration(new ConfigurationBuilder()
            .SetBasePath("C:\\RealProject\\RealProject.WebAPI")
                .AddJsonFile("appsettings.json")
                .Build())
                .UseStartup<Startup>()
            .UseStartup<Startup>());

真实项目Startup.cs

    public Startup(IConfiguration configuration, IHostingEnvironment hostingEnvironment)
    {
        Configuration = configuration;
        HostingEnvironment = hostingEnvironment;
    }

    public IHostingEnvironment HostingEnvironment { get; }
    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public IServiceProvider ConfigureServices(IServiceCollection services)
    {

        var conf = Configuration;
        IConfiguration appConf = conf.GetSection("ConnectionStrings");
        var connstring = appConf.GetValue<string>("DatabaseConnection");

        services.AddDbContext<DbContext>(a => a.UseSqlServer(connstring));

应用程序设置.Json

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "ConnectionStrings": {
    "DatabaseConnection": "Data Source=.;Initial Catalog=ApplicationDatabase;Integrated Security=True"
  }
}

您想要做的是为您的 WebApplication 创建一个采用 Startup 类型的工厂。然后您可以使用IClassFixture https://xunit.net/docs/shared-context#class-fixture接口与测试类中的所有测试共享该工厂的上下文。

这在实践中看起来是这样的:

public class CustomWebApplicationFactory<TStartup> : WebApplicationFactory<Startup> where TStartup : class
{
    public CustomWebApplicationFactory() { }

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder
            .ConfigureTestServices(
                services =>
                {
                    services.Configure(AzureADDefaults.OpenIdScheme, (System.Action<OpenIdConnectOptions>)(o =>
                    {
                        // CookieContainer doesn't allow cookies from other paths
                        o.CorrelationCookie.Path = "/";
                        o.NonceCookie.Path = "/";
                    }));
                }
            )
            .UseEnvironment("Production")
            .UseStartup<Startup>();
    }
}


public class AuthenticationTests : IClassFixture<CustomWebApplicationFactory<Startup>>
{
    private HttpClient _httpClient { get; }

    public AuthenticationTests(CustomWebApplicationFactory<Startup> fixture)
    {
        WebApplicationFactoryClientOptions webAppFactoryClientOptions = new WebApplicationFactoryClientOptions
        {
            // Disallow redirect so that we can check the following: Status code is redirect and redirect url is login url
            // As per https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.2#test-a-secure-endpoint
            AllowAutoRedirect = false
        };

        _httpClient = fixture.CreateClient(webAppFactoryClientOptions);
    }

    [Theory]
    [InlineData("/")]
    [InlineData("/Index")]
    [InlineData("/Error")]
    public async Task Get_PagesNotRequiringAuthenticationWithoutAuthentication_ReturnsSuccessCode(string url)
    {
        // Act
        HttpResponseMessage response = await _httpClient.GetAsync(url);

        // Assert
        response.EnsureSuccessStatusCode();
    }
}

我跟着导游here https://fullstackmark.com/post/20/painless-integration-testing-with-aspnet-core-web-api让它在我自己的代码中工作。

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

Net Core集成测试:从其他程序运行Startup.cs和配置 的相关文章

随机推荐

  • 如何:动态移动 Google Gauge?

    观察 CPU 和内存指标 http code google com apis visualization documentation gallery gauge html Loading一会儿 它们动态地移动 下面显示的示例代码不会像那样移
  • 来自 nginx/passenger 的“从应用程序收到的响应不完整”

    我尝试通过 capistrano 在 nginx 和 ubuntu 上部署我的 Rails 应用程序 就像页面上的教程一样https gorails com deploy ubuntu 14 04 https gorails com dep
  • Java 8 替代 Map.entry() 将值映射到新 Map?

    我找到了解决长期以来一直试图解决的问题的解决方案 不幸的是 我无法使用该解决方案 因为目标 java 版本是 Java 8 Map
  • 如何在大型 SQL Server 查询中使用多个核心?

    我有两台 SQL Server 一台用于生产 一台用作存档 每天晚上 我们都会运行一个 SQL 作业并将当天的生产数据复制到存档中 随着我们的成长 这个过程需要的时间越来越长 当我观察运行归档进程的归档服务器上的利用率时 我发现它只使用单个
  • C# 中的 Jaro–Winkler 距离算法

    如何在 C 中实现 Jaro Winkler 距离字符串比较算法 public static class JaroWinklerDistance The Winkler modification will not be applied un
  • 使用 log4j 编写审核日志

    我有一个应用程序需要写入两种不同类型的日志 应用程序日志和审核日志 应用程序日志用于调试目的 而审核日志用于记录所执行的操作 两个日志将位于不同的文件中 每个文件应仅包含上述日志 意味着审核日志文件不能包含应用程序日志 反之亦然 如何使用
  • 在 Node.js 中缓存数据最便宜的方法?

    我正在实现一个运行匹配算法的 Node js 服务器 由于我希望服务器尽快响应 因此我希望能够从缓存中检索数据 而不是每次都查询数据库 例如 我需要保留 10000 50000 个用户的信息 我担心这会占用大量内存 有没有什么方法可以将这么
  • Nodemailor 无法跨域发送电子邮件

    我正在使用 NodeMailor 通过 Node 和 Express 应用程序发送电子邮件 问题 当我跨域发送电子邮件时 例如 我正在使用 Hostgator 电子邮件服务器 它仅使用 Hostgator 在托管电子邮件上发送电子邮件 但当
  • 如何使用 htaccess 强制使用 http- 而不是 https

    我的整个域有一个目录 我想强制使用 https 即 docs 在 docs 文件夹中 我有以下 htaccess 文件 RewriteEngine On RewriteCond HTTPS on RewriteRule https HTTP
  • 在 ngIf 内动态添加组件

    我有一些代码可以动态地向我的页面之一添加 删除组件 这似乎工作得很好 我的方法基于 Rob Wormald 的很棒的方法NG2 高级讲座 https www youtube com watch v ZqGvilzDbac 以标准方式做事看起
  • html文本框的最大长度是多少

    任何人都可以帮助我确定普通 HTML 文本框中可以包含的最大字符长度 至于 HTML 方面 当maxlength未指定属性 则输入值的最大长度不受限制 但是 如果您将请求发送为GET代替POST 那么限制将取决于 Web 浏览器和 Web
  • 如何使用 Boost.Asio 解析主机(仅)?

    根据文档 http www boost org doc libs 1 36 0 doc html boost asio reference ip basic resolver query basic resolver query html
  • 如何在 C# 中使用堆栈计算 Infix-Expression 的输出

    我已经在 Stackoverflow 上找到了不同的解决方案 但有些事情我不明白 计算输出的最佳方法是什么 例如 1 4 2 3 2 3 4 5 我的方法如下 但我知道其中有很多错误 public static int ComputeInf
  • 将多条记录导入 CRM

    如何将数千条记录导入 CRM 我有一个可能包含数千条记录的列表 并希望在 CRM 中创建这些记录 目前 我有一个接收列表的方法 该方法调用另一个方法来批量创建 200 条记录 直到创建整个列表 最初一次是 1000 个 因为这是 Execu
  • 如何从一个字节中获取某个位置的某个位的值?

    如果我有一个字节 该方法将如何检索某个位置的位 这是我所知道的 但我认为这不起作用 public byte getBit int position return byte ID gt gt position 1 where ID是我从中检索
  • 如何在多个设备上同时运行 Monkeyrunner 脚本

    我正在尝试在多个设备上运行 Monkeyrunner 脚本来执行一些基本操作 我发现最初我将开始编写一个脚本来在两个连接的设备中执行基本操作 from com android monkeyrunner import MonkeyRunner
  • 如何在Python中将所有打印导出到.txt文件? [复制]

    这个问题在这里已经有答案了 可能的重复 将 stdout 重定向到 Python 中的文件 https stackoverflow com questions 4675728 redirect stdout to a file in pyt
  • PHP:从对象获取单个键

    我有一个带有单个键及其值的对象 但我不知道访问它的密钥 在不枚举对象的情况下获取密钥的最有效方法是什么 如果你只是想访问值 你不需要钥匙 实际上属性名称 完全 value current array object 如果你真的想要属性名称 尝
  • iOS 上的 C# IL2CPP 通过反射调用泛型方法

    这个问题专门针对 Unity3d IL2CPP 和 iOS 使用反射调用泛型方法 class SourceValue
  • Net Core集成测试:从其他程序运行Startup.cs和配置

    我们正在创建一个集成单元测试 Xunit 它调用 Real Application Startup cs 由于某种原因 真实项目可以正确读取配置文件 属性 但是从集成测试运行它 它无法读取它 它没有将任何内容放入下面的配置 conf 变量中