我有一个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地址,因为远程地址
始终为空。
有没有办法从测试代码中将其设置为某个已知值?我一直在这里搜索,但没有找到类似的东西。助教
使用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>();
});
}
}
根据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);
};
}
}
您可以编写中间件来设置自定义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方式,记录下步骤,方便以后查阅,希