使用XUnit2项目解决依赖关系,类似于使用MVC6 Core 1.0项目完成的方式

时间:2016-03-14 15:18:01

标签: c# asp.net asp.net-core xunit asp.net-core-1.0

我正在尝试创建涉及调用我的业务层的单元测试,而业务层又调用我的存储库层。

首先,请看看我是如何使用完美运行的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中连接依赖项。

1 个答案:

答案 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。