我有一个.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类没有实例化。我如何在我的测试项目中执行此操作?
答案 0 :(得分:3)
我认为我的Startup.Cs类没有实例化。我如何在我的测试项目中执行此操作?
你没有。
您的Startup.cs运行以引导您的应用程序,其中包含实际与外界通信的类(例如数据库)。
在单元测试中,您模拟了依赖项,因此您只需测试当前单元而不是其依赖项。所以你的测试类看起来像这样:
public TestHelpers()
{
_context = new Mock<MyDataContext>();
_uow = new UnitOfWork(_context.Object);
}
您也可以使用内存数据库进行测试,而不是模拟。另请参阅Testing with InMemory。