Я построил WebAPI и помимо моих тестов, работающих на Postman, я хотел бы реализовать некоторые интеграционные / модульные тесты.
Теперь моя бизнес-логика очень тонкая, в большинстве случаев ее больше из грубых действий, поэтому я хотел начать с тестирования моих контроллеров.
У меня есть базовая настройка. Шаблон репозитория (интерфейсы), службы (бизнес-логика) и контроллеры.
Поток идет контроллер (DI Service) — > Service (DI Repo) — > > Repo действие!
Таким образом, то, что я сделал, было переопределить мой файл запуска, чтобы изменить в базу данных в памяти, а остальное должно быть хорошо (я бы предположил) услуги добавляются, repos добавляются, и теперь я указываю в БД в памяти, которая хороша для моего основного тестирования.
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));
}
}
}
Чего мне не хватает?
Нельзя использовать инъекцию зависимостей для тестовых классов. Вы можете только позволить xunit вводить специальные приспособления через конструктор (см. docs ).
Для интеграционного тестирования необходимо использовать
TestServer
класс изMicrosoft.AspNetCore.TestHost
пакета и отдельныйStartup.cs
класс (проще настроить конфигурацию, чем наследование imho).В проекте модульного тестирования необходимо создать экземпляр
TestServer
и выполнить тест.Теперь, когда вы вызываете операции, которые пишут в базу данных, вы также можете проверить, действительно ли данные записаны в базу данных: