У меня есть WebAPI, и помимо моих тестов, запущенных на Postman, я хотел бы реализовать некоторые тесты интеграции/модуля.XUnit DI через переопределенный файл автозагрузки (.net core)
Теперь моя бизнес-логика очень тонкая, большую часть времени она больше выполняет CRUD-действия, поэтому я хотел начать тестирование моих контроллеров.
У меня есть базовая установка. Шаблон репозитория (интерфейсы), Услуги (бизнес-логика) и Контроллеры. Поток идет Контроллер (Служба DI) -> Сервис (DI-репо) -> Репо-действие!
Так что я сделал переопределение моего загрузочного файла, чтобы изменить его в базу данных в памяти, а остальное должно быть прекрасным (я бы предположил, что услуги добавлены, добавляются репозитории и теперь я указываю на БД памяти, отлично подходит для моего основного тестирования.
namespace API.UnitTests
{
public class TestStartup : Startup
{
public TestStartup(IHostingEnvironment env)
: base(env)
{
}
public void ConfigureTestServices(IServiceCollection services)
{
base.ConfigureServices(services);
//services.Replace<IService, IMockedService>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
base.Configure(app, env, loggerFactory);
}
public override void SetUpDataBase(IServiceCollection services)
{
var connectionStringBuilder = new SqliteConnectionStringBuilder { DataSource = ":memory:" };
var connectionString = connectionStringBuilder.ToString();
var connection = new SqliteConnection(connectionString);
services
.AddEntityFrameworkSqlite()
.AddDbContext<ApplicationDbContext>(
options => options.UseSqlite(connection)
);
}
}
}
я написал свой первый тест, но DatasourceService не существует:
Следующие параметры конструктора не имеют соответствия данных арматуре: DatasourceService datasourceService
namespace API.UnitTests
{
public class DatasourceControllerTest
{
private readonly DatasourceService _datasourceService;
public DatasourceControllerTest(DatasourceService datasourceService)
{
_datasourceService = datasourceService;
}
[Xunit.Theory,
InlineData(1)]
public void GetAll(int companyFk) {
Assert.NotEmpty(_datasourceService.GetAll(companyFk));
}
}
}
Что утра Я пропустил?
IIRC вы не можете использовать зависимость инъекции на тестовых классов , Вы можете разрешить xunit вводить специальные приспособления через конструктор (https://xunit.github.io/docs/shared-context.html см. Классные и коллекционные светильники). Для интеграционных тестов вам нужно получить экземпляр 'IServiceProvider' и разрешить его обслуживание. Для тестирования контроллера вы должны использовать 'TestServer' class => docs.microsoft.com/en-us/aspnet/core/testing/integration-testing – Tseng
Также вы можете не захотеть наследовать от Startup.cs и вместо этого иметь отдельный класс , с кодом начальной загрузки. переопределение не работает с некоторыми конфигурациями (т. е. когда вам нужно выполнить код после A, но до B). При регистрации в течение двух раз один и тот же интерфейс может привести к исключениям, когда вы вызываете «GetRequiredService», потому что зарегистрировано более одного (если вы, следовательно, не используете 'services.TryAddXxx()' –
Tseng
'Если тестовым классам необходим доступ к fixture, добавьте его как аргумент конструктора, и он будет предоставлен автоматически. 'Так что Fixtures могут использовать DI, но вы не можете DI от запуска? Ну, это позор. Ну, конечно, регистрацию дважды и т. д. можно ожидать. все же, если бы я мог сделать DI через запуск в тестах, тогда я бы прошел тест и работал в секундах. – Drakoumel