Я пытаюсь внедрить Dependency Injection в тесте Xunit для AppService. Идеальная цель - запустить исходную прикладную программу Startup/configuration и использовать любую инъекцию зависимостей, которая была в Startup, вместо повторной инициализации всего DI в моем тесте - вот и вся рассматриваемая цель.
Обновление: Мохсен ответ близок. Необходимо обновить пару синтаксических/требований ошибок для работы.
По какой-то причине оригинальное приложение работает и может позвонить в отдел обслуживания приложений. Тем не менее, он не может позвонить в Xunit. Наконец получил Testserver, работающий с использованием запуска и настройки из оригинального приложения. Теперь получаю ошибку ниже:
Message: The following constructor parameters did not have matching fixture data: IDepartmentAppService departmentAppService
namespace Testing.IntegrationTests
{
public class DepartmentAppServiceTest
{
public DBContext context;
public IDepartmentAppService departmentAppService;
public DepartmentAppServiceTest(IDepartmentAppService departmentAppService)
{
this.departmentAppService = departmentAppService;
}
[Fact]
public async Task Get_DepartmentById_Are_Equal()
{
var options = new DbContextOptionsBuilder<SharedServicesContext>()
.UseInMemoryDatabase(databaseName: "TestDatabase")
.Options;
context = new DBContext(options);
TestServer _server = new TestServer(new WebHostBuilder()
.UseContentRoot("C:\\OriginalApplication")
.UseEnvironment("Development")
.UseConfiguration(new ConfigurationBuilder()
.SetBasePath("C:\\OriginalApplication")
.AddJsonFile("appsettings.json")
.Build()).UseStartup<Startup>());
context.Department.Add(new Department { DepartmentId = 2, DepartmentCode = "123", DepartmentName = "ABC" });
context.SaveChanges();
var departmentDto = await departmentAppService.GetDepartmentById(2);
Assert.Equal("123", departmentDto.DepartmentCode);
}
}
}
Я получаю эту ошибку:
Message: The following constructor parameters did not have matching fixture data: IDepartmentAppService departmentAppService
Необходимо использовать внедрение зависимостей в тестировании, как в реальном приложении. Оригинальное приложение делает это. Приведенных ниже ответов в настоящее время недостаточно, один использует насмешку, которая не является текущей целью, другой ответ использует контроллер, который обходит цель вопроса.
Примечание. IDepartmentAppService зависит от IDepartmentRepository, который также вводится в класс запуска, и от зависимостей Automapper. Вот почему вызывается весь класс запуска.
Хорошие ресурсы: