我正在尝试创建涉及调用我的业务层的单元测试,而业务层又调用我的存储库层。
首先,请看看我是如何使用完美运行的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未解析。我知道为什么会这样,我只是不知道如何使用内置的ASP.NET DI来解决这些依赖关系,就像MVC6应用程序一样。
我相信这github post正是我想要做的。有人有解决方案吗?
我相信我想知道的是如何使用新的ASP.NET依赖注入在XUnit Fixture中连接依赖项。
答案 0 :(得分:0)
我不知道为什么我一直在研究如何使用依赖注入这时我只需要将appsettings.json文件添加到包含db连接字符串的Test Project中,然后在我的TestFixture中执行此操作:
<!-- <a ...
然后在我的Test类中访问这样的夹具:
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()
{
}
}
如您所见,我可以调用fixture.Configuration来满足实例化新客户存储库的需要。
此解决方案为我提供了完全的灵活性,可以更换每个单元测试的存储库层,并指定每个单元测试所需的服务。如果要在TestFixture级别指定服务并将它们设置为公共属性,那么只为所有测试创建一次,您只需在测试中调用fixture.CustomerService。