【问题标题】:Resolving dependencies with an XUnit2 project, similar to how it is done with an MVC6 Core 1.0 project使用 XUnit2 项目解决依赖关系,类似于使用 MVC6 Core 1.0 项目的方式
【发布时间】:2016-03-15 01:49:51
【问题描述】:

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

首先,请看看我是如何使用运行良好的 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;
    }
}

考虑到上述内容,请查看我在解决与我的 MVC6 应用程序无关的 XUnit project using a Class Fixture 中的依赖项时遇到的问题。

这是我的 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 中连接依赖。

【问题讨论】:

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


    【解决方案1】:

    我不知道为什么我一直在研究如何使用依赖注入,而我只需要将一个 appsettings.json 文件添加到包含 db 连接字符串的测试项目中,然后在我的 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()
        {
    
        }
    }
    

    然后在我的 Test 类中像这样访问夹具:

    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 级别指定您的服务并将它们设为公共属性,以便只为所有测试创建一次,您只需在测试中调用 fixture.CustomerService。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 2017-07-13
      • 2014-09-05
      • 2015-11-04
      • 2021-08-24
      • 1970-01-01
      • 2014-05-05
      相关资源
      最近更新 更多