Это не так, как это работает. Интеграционный тест - это тест набора компонентов, составляющих приложение single . Если вы тестируете Api1, вы не раскручиваете экземпляры Api2 и Api3;Вы издеваетесь над ними так, чтобы они вели себя известным и предсказуемым образом. Если вы использовали реальные экземпляры, даже test instance, то сбой в Api2 может привести к сбою вашего теста Api1, даже если в Api1 нет ничего плохого. Итак, Api1 может обмениваться даннымидля Api2 вам потребуется HttpClient
для отправки запросов. Это HttpClient
должно быть предоставлено IHttpClientFactory
и введено в класс обслуживания, зарегистрированный как типизированный клиент. В этом классе обслуживания вы бы добавили методы, соответствующие вызовам API. Для тестируемости этот класс обслуживания должен реализовывать интерфейс, и вам следует вводить интерфейс всякий раз, когда вам нужно работать с этим API. Это выглядит примерно так:
public interface IApi2Service
{
Task<Foo> GetFooByIdAsync(int id);
}
public class Api2Service : IApi2Service
{
private readonly HttpClient _client;
public Api2Service(HttpClient client)
{
_client = client;
}
public async Task<Foo> GetFooByIdAsync(int id)
{
// use _client to make the API call
}
}
Затем в Startup.ConfigureServices
:
services.AddHttpClient<IApi2Service, Api2Service>(c =>
{
c.BaseAddress = new Uri(Configuration["Api2BaseAddress"]);
});
И, наконец, в классе (возможно, контроллере) в Api1, где вам нужно взаимодействовать с Api2, вы делаете:
public class SomeApi1Controller : ControllerBase
{
private readonly IApi2Service _api2Service;
public SomeApi1Controller(IApi2Service api2Service)
{
_api2Service = api2Service;
}
public async Task<IActionResult> SomeAction()
{
var foo = await _api2Service.GetFooByIdAsync(1);
}
}
Теперь, когда ваш код правильно настроен, вы просто добавите в тестовую реализацию Api2Service
и заглушите метод GetFooByIdAsync
, чтобы просто вернуть тест Foo
экземпляр, вместо на самом деле совершение вызова Api2 через HttpClient
. Таким образом, вы точно знаете, что будет возвращено, и сможете соответствующим образом спроектировать свой тест, возвращая различные типы Foo
в зависимости от того, что вы тестируете.