我正在尝试创建涉及调用我的业务层的单元测试,该业务层又调用我的存储库层。
首先,请看看我是如何使用运行良好的 ASP.NET MVC6 WebApp 执行此操作的:
//Startup.cs of MVC Web App
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.AddSingleton(_=> Configuration);
services.AddTransient<ICustomerService, CustomerService>();
services.AddTransient<ICustomerRepository, CustomerRepository>();
}
public class CustomersController : Controller
{
private ICustomerService _service;
public CustomersController(ICustomerService service)
{
_service= service;
}
}
public class CustomerService : ICustomerService
{
private ICustomerRepository _repository;
public PriceProtectionManager(ICustomerRepository repository)
{
_repository = repository;
}
}
public class CustomerRepository : BaseRepository, ICustomerRepository
{
public CustomerRepository(IConfigurationRoot config)
: base(config)
{
}
}
public class BaseRepository
{
private IConfigurationRoot _config;
public BaseRepository(IConfigurationRoot config)
{
_config = config;
}
}
考虑到上述情况,请查看我在 XUnit project using a Class Fixture 中解决依赖关系的问题这与我的 MVC6 应用程序无关。
这是我的 Fixture 类的样子:
public class DatabaseFixture : IDisposable
{
public ICustomerService CustomerService;
public DatabaseFixture()
{
// HOW CAN I RESOLVE DEPENDENCIES HERE USING THE NEW ASP.NET DI
CustomerService = service;
}
public void Dispose()
{
}
}
public class MyTests : IClassFixture<DatabaseFixture>
{
DatabaseFixture fixture;
public MyTests(DatabaseFixture fixture)
{
this.fixture = fixture;
}
[Fact]
public void MyFirstTest()
{
fixture.CustomerRepository.GetAllCustomers();
}
}
当我在测试中运行时,我收到 CustomerService Unresolved 错误。我知道为什么会这样,我只是不知道如何使用内置的 ASP.NET DI 为我的测试解决这些依赖关系,就像 MVC6 应用程序那样。
我相信这个github post这正是我想要做的。有人对此有解决方案吗?
我相信我想知道的是如何使用新的 ASP.NET 依赖注入(inject)在 XUnit Fixture 中连接依赖。
最佳答案
我不确定为什么我一直在研究如何使用依赖注入(inject),而我只需要将一个 appsettings.json 文件添加到我的包含数据库连接字符串的测试项目,然后在我的 TestFixture 中执行此操作:
public class TestFixture : IDisposable
{
public IConfigurationRoot Configuration { get; set; }
public TestFixture()
{
// Set up configuration sources.
var builder = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public void Dispose()
{
}
}
然后在我的测试类中像这样访问夹具:
public class MyTests: IClassFixture<TestFixture>
{
TestFixture fixture;
public MyTests(TestFixture fixture)
{
this.fixture = fixture;
}
[Fact]
public void MyFirstTest()
{
ICustomerRepository customerRepository = new CustomerRepository(fixture.Configuration);
CustomerService customerService = new CustomerService(customerRepository);
}
如您所见,我可以调用 fixture.Configuration 来满足实例化新客户存储库的需要。
这个解决方案让我可以完全灵活地更换每个单元测试的存储库层,并指定每个单元测试需要哪些服务。如果您想在 TestFixture 级别指定您的服务并使它们成为公共(public)属性,那么它只为所有测试创建一次,您只需在测试中调用 fixture.CustomerService。
关于c# - 解决 XUnit2 项目的依赖关系,类似于处理 MVC6 Core 1.0 项目的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35991360/