1 回答

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
如果我正確理解你的問題,那么有一種非常簡(jiǎn)單的方法可以做到這一點(diǎn)。在Microsoft.AspNetCore.TestHost命名空間中,有一個(gè)TestServer類可以讓您輕松地為您的 API 啟動(dòng)測(cè)試服務(wù)器。但是,有一些事情需要你注意,比如加載什么配置,加載什么服務(wù)等等。這樣做的背景是,當(dāng)您測(cè)試和使用內(nèi)存集合或任何可能適合您的測(cè)試時(shí),您可能想模擬一些服務(wù),如數(shù)據(jù)庫存儲(chǔ)庫。
這是一個(gè)基本的實(shí)現(xiàn)。首先,在你要測(cè)試的API中,確保需要模擬的服務(wù)是通過Startup類中的虛方法注冊(cè)的。
剝離方法的示例ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
RegisterDatabase(services);
}
并且實(shí)現(xiàn)也在Startup.cs(我在這個(gè)例子中使用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);
});
}
請(qǐng)注意,數(shù)據(jù)處理類特定于我從中獲取此示例的 API。
接下來在測(cè)試項(xiàng)目中(不管您使用什么測(cè)試運(yùn)行程序或單元測(cè)試框架),您將創(chuàng)建一個(gè)StartUp覆蓋數(shù)據(jù)庫注冊(cè)的類。例如,在此覆蓋中,您可以注冊(cè)模擬。
public class MyTestStartup : Startup
{
public MyTestStartup(IConfiguration configuration)
{
Configuration = configuration;
}
protected override void RegisterDatabase(IServiceCollection services)
{
services.AddScoped<IMyDbProcessor>(db => new TestDbProcessor());
}
}
然后仍然在單元測(cè)試項(xiàng)目中,您可以創(chuàng)建一個(gè)類來保存您的測(cè)試服務(wù)器并根據(jù)需要進(jìn)行配置。這是一個(gè)看起來如何的示例:
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)部分?!俺绦颉睉?yīng)該P(yáng)rogram.cs在您的 API 中引用您的。然后在單元測(cè)試類中,您可以使用該類的構(gòu)造函數(shù)來創(chuàng)建一個(gè)新服務(wù)器并獲取所需的客戶端進(jìn)行調(diào)用。
_server = new MyTestServer();
_client = _server.Client;
現(xiàn)在您可以使用客戶端調(diào)用您的 API。每次運(yùn)行測(cè)試時(shí),都會(huì)有一個(gè)運(yùn)行 API 的測(cè)試服務(wù)器。 注意:如果您不想添加自定義配置(特別針對(duì)您的測(cè)試環(huán)境),您可以簡(jiǎn)化 Web 服務(wù)器的創(chuàng)建。
- 1 回答
- 0 關(guān)注
- 128 瀏覽
添加回答
舉報(bào)