Если я правильно понимаю ваш вопрос, есть очень простой способ сделать это.В nampespace 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. Примечание : если вы не хотите добавлять пользовательскую конфигурацию (настолько специфичную для вашей тестовой среды), вы можете упростить создание веб-сервера.