1 回答
TA贡献1921条经验 获得超9个赞
如果我正确理解你的问题,那么有一种非常简单的方法可以做到这一点。在Microsoft.AspNetCore.TestHost命名空间中,有一个TestServer类可以让您轻松地为您的 API 启动测试服务器。但是,有一些事情需要你注意,比如加载什么配置,加载什么服务等等。这样做的背景是,当您测试和使用内存集合或任何可能适合您的测试时,您可能想模拟一些服务,如数据库存储库。
这是一个基本的实现。首先,在你要测试的API中,确保需要模拟的服务是通过Startup类中的虚方法注册的。
剥离方法的示例ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
RegisterDatabase(services);
}
并且实现也在Startup.cs(我在这个例子中使用Mongo):
protected virtual void RegisterDatabase(IServiceCollection services)
{
string mongoConnectionString = Configuration.GetConnectionString("DevCN");
services.AddScoped<IMyDbProcessor, MyDbProcessor>(sp =>
{
var mongoClient = new MongoClient(mongoConnectionString);
return new MyDbProcessor(mongoClient);
});
}
请注意,数据处理类特定于我从中获取此示例的 API。
接下来在测试项目中(不管您使用什么测试运行程序或单元测试框架),您将创建一个StartUp覆盖数据库注册的类。例如,在此覆盖中,您可以注册模拟。
public class MyTestStartup : Startup
{
public MyTestStartup(IConfiguration configuration)
{
Configuration = configuration;
}
protected override void RegisterDatabase(IServiceCollection services)
{
services.AddScoped<IMyDbProcessor>(db => new TestDbProcessor());
}
}
然后仍然在单元测试项目中,您可以创建一个类来保存您的测试服务器并根据需要进行配置。这是一个看起来如何的示例:
public class MyTestServer
{
//I add an HttpClient that will be used in the test methods to make the actual call
internal HttpClient Client { get; set; }
public MyTestServer()
{
IWebHostBuilder builder = new WebHostBuilder()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
IHostingEnvironment env = hostingContext.HostingEnvironment;
config.AddJsonFile("testsettings.json", optional: true)
.AddJsonFile($"testsettings.{env.EnvironmentName}.json", optional: true);
})
.UseStartup<MyTestStartup>();
builder.UseSetting(WebHostDefaults.ApplicationKey, typeof(Program).GetTypeInfo().Assembly.FullName);
var testServer = new TestServer(builder);
Client = testServer.CreateClient();
}
}
这里要特别注意的typeof(Program).GetTypeInfo().Assembly.FullName)部分。“程序”应该Program.cs在您的 API 中引用您的。然后在单元测试类中,您可以使用该类的构造函数来创建一个新服务器并获取所需的客户端进行调用。
_server = new MyTestServer();
_client = _server.Client;
现在您可以使用客户端调用您的 API。每次运行测试时,都会有一个运行 API 的测试服务器。 注意:如果您不想添加自定义配置(特别针对您的测试环境),您可以简化 Web 服务器的创建。
- 1 回答
- 0 关注
- 80 浏览
添加回答
举报