当前位置: 首页 > 知识库问答 >
问题:

在与Asp的集成测试中设置虚拟IP地址。Net核心测试服务器

张翰音
2023-03-14

我有一个C#Asp。Net Core(1.x)项目,实现web REST API及其相关的集成测试项目,其中在任何测试之前,都有类似以下设置:

// ...

IWebHostBuilder webHostBuilder = GetWebHostBuilderSimilarToRealOne()
    .UseStartup<MyTestStartup>();

TestServer server = new TestServer(webHostBuilder);
server.BaseAddress = new Uri("http://localhost:5000");

HttpClient client = server.CreateClient();

// ...

在测试期间,客户端用于将HTTP请求发送到Web API(测试中的系统)并检索响应。

在实际的测试系统中,有一些组件从每个请求中提取发送方IP地址,如下所示:

HttpContext httpContext = ReceiveHttpContextDuringAuthentication();

// edge cases omitted for brevity
string remoteIpAddress = httpContext?.Connection?.RemoteIpAddress?.ToString()

现在,在集成测试期间,这段代码无法找到IP地址,因为远程地址始终为空。

有没有办法从测试代码中将其设置为某个已知值?我一直在这里搜索,但没有找到类似的东西。助教

共有3个答案

凤安然
2023-03-14

使用WebHost。CreateDefaultBuilder可能会搞乱你的应用程序配置。

除非绝对必要,否则没有必要仅仅为了适应测试而更改产品代码。

在不覆盖Startup类方法的情况下,添加自己的中间件的最简单方法是通过IStartupFilter添加中间件,正如Elliott的回答所建议的那样。

而不是使用WebHost。CreateDefaultBuilder,只需使用

base.CreateWebHostBuilder().ConfigureServices...

    public class CustomWAF : WebApplicationFactory<Startup>
    {
        protected override IWebHostBuilder CreateWebHostBuilder()
        {
            return base.CreateWebHostBuilder().ConfigureServices(services =>
            {
                services.AddSingleton<IStartupFilter, CustomStartupFilter>();
            });
        }
    }
花品
2023-03-14

根据ASP中的回答。NET内核,是否有任何方法可以从程序中设置中间件。反恐精英?

还可以从ConfigureServices配置中间件,这允许您创建自定义WebApplicationFactory,而无需StartupStub类:

public class CustomWebApplicationFactory : WebApplicationFactory<Startup>
{
    protected override IWebHostBuilder CreateWebHostBuilder()
    {
        return WebHost
            .CreateDefaultBuilder<Startup>(new string[0])
            .ConfigureServices(services =>
            {
                services.AddSingleton<IStartupFilter, CustomStartupFilter>();
            });
    }
}


public class CustomStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return app =>
        {
            app.UseMiddleware<FakeRemoteIpAddressMiddleware>();
            next(app);
        };
    }
}
梁丘霖
2023-03-14

您可以编写中间件来设置自定义IP地址,因为此属性是可写的:

public class FakeRemoteIpAddressMiddleware
{
    private readonly RequestDelegate next;
    private readonly IPAddress fakeIpAddress = IPAddress.Parse("127.168.1.32");

    public FakeRemoteIpAddressMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        httpContext.Connection.RemoteIpAddress = fakeIpAddress;

        await this.next(httpContext);
    }
}

然后您可以像这样创建StartupStub类:

public class StartupStub : Startup
{
    public StartupStub(IConfiguration configuration) : base(configuration)
    {
    }

    public override void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMiddleware<FakeRemoteIpAddressMiddleware>();
        base.Configure(app, env);
    }
}

并使用它创建一个TestServer

new TestServer(new WebHostBuilder().UseStartup<StartupStub>());
 类似资料:
  • 我将此文档用于集成测试:ASP.NET核心集成测试,这是我的简化集成测试: 正如您所看到的,我正在向“/API/v1/application/acceptoffer”API发送一个HTTP请求,该API更新数据库中的一些实体,如果一切正常,则返回状态代码200。 一个解决方案是使用DbContext的单例,然后将所有测试包装在事务中,但问题是SQL不支持嵌套事务,如果API也使用事务,它将引发运行

  • 我有两个Spring Boot应用程序,它们最终调用外部REST API。其结构大致如下:

  • 如何模拟集成测试所需的许多依赖关系? 我使用Mockito进行纯单元测试。在这种情况下,Pure意味着测试一个类,嘲笑它的所有依赖关系。漂亮。 现在是集成测试。假设在这种情况下,集成测试将测试以下内容: 消息被放入队列 我们也可以说,在第2步中发生的处理是严肃的事情。它依赖于大量的数据库交互、多种外部服务、文件系统,以及各种各样的东西。流还会引发很多副作用,所以我不能简单地确保响应是正确的——我需

  • 情况和问题:在Spring Boot中,我如何将一个或多个模拟类/bean注入应用程序以进行集成测试?在StackOverflow上有一些答案,但它们集中在Spring Boot 1.4之前的情况,或者只是不适合我。 背景是,在下面的代码中,设置的实现依赖于第三方服务器和其他外部系统。设置的功能已经在单元测试中测试过了,所以对于完整的集成测试,我想模拟出对这些服务器或系统的依赖,只提供虚拟值。 M

  • 本文向大家介绍虚拟机中CentOS7设置固定IP地址的方法,包括了虚拟机中CentOS7设置固定IP地址的方法的使用技巧和注意事项,需要的朋友参考一下 由于我的开发环境是在VMWare虚拟机里安装Centos,然后在host文件中设置拦截,这样就可以直接跳转虚拟机的CentOS,但是虚拟机的IP地址总是会变,就要随时修改host文件,很麻烦。决定虚拟机采用固定IP方式,记录下步骤,方便以后查阅,希