c# - 解决 XUnit2 项目的依赖关系,类似于处理 MVC6 Core 1.0 项目的方式

标签 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 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/

相关文章:

c# - 如何确定某个日期的周数?

asp.net - 如何在 Web 服务器上验证 http 请求

asp.net - tfignore 文件不忽略 asp.net 5 项目的文件

c# - 将 Bot Framework Bot 作为 Azure Web 应用程序工作,突然没有配置更改,出现 SecurityTokenSignatureKeyNotFoundException : IDX10501

error-handling - 防止直接从请求执行错误页面操作

c# - 如何将 Observable.FromEvent 与静态事件一起使用?

c# - powerShell.AddCommand 的使用

C# EF Deep Lambda 非重复计数查询

c# - WinForms 中多余的滚动条

c# - Asp.net - 显示脚本警报时新窗口正在关闭