如何在.net Core 2.0 Unit Test项目中使用DI和Startup类

时间:2018-01-30 14:33:19

标签: c# entity-framework dependency-injection .net-core integration-testing

我有一个.net Core 2.0单元测试项目,我想在我的数据类库上执行一些单元测试。

但是,在这个单元测试项目中,我想使用: - Startup.cs - 依赖注入

到目前为止,我已经包含了以下额外的NuGet包:

- Microsoft.Extensions.Configuration (2.0.0)
- Microsoft.Extensioins.DependencyInjection (2.0.0)

另外,我创建了一个Startup.cs,我想在其中使用默认的内置注入配置文件(appsettings.json):

public class Startup
{
    public static IConfiguration _config { get; private set; }

    public Startup(IConfiguration config)
    {
        _config = config;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        var connection = _config.GetConnectionString("DefaultConnectionString");

        services.AddDbContext<MyDataContext>(options => options.UseSqlServer(connection));
    }
}

现在我卡住了。

我无法在我的测试类中使用参数创建构造函数重载,我认为这将是前进的方式,如下所示:

[TestClass]
public class TestHelpers
{
    private MyDataContext _context;
    private UnitOfWork _uow;
    private IDbContextTransaction _transaction;

    public TestHelpers(MyDataContext context)
    {
        _context = context;

        _uow = new UnitOfWork(_context);
    }

    [TestInitialize]
    public void Init()
    {
        _transaction = _context.Database.BeginTransaction();
    }

这不起作用,因为MS TestFramework需要无参数构造函数。所以,我不能注射&#39;我在测试类的构造函数中的datacontext。

我该如何处理?

另外,我认为我的Startup.Cs类没有实例化。我如何在我的测试项目中执行此操作?

1 个答案:

答案 0 :(得分:3)

  

我认为我的Startup.Cs类没有实例化。我如何在我的测试项目中执行此操作?

你没有。

您的Startup.cs运行以引导您的应用程序,其中包含实际与外界通信的类(例如数据库)。

在单元测试中,您模拟了依赖项,因此您只需测试当前单元而不是其依赖项。所以你的测试类看起来像这样:

public TestHelpers()
{
    _context = new Mock<MyDataContext>();

    _uow = new UnitOfWork(_context.Object);
}

您也可以使用内存数据库进行测试,而不是模拟。另请参阅Testing with InMemory