使用有界DbContexts进行集成测试

本文关键字:集成测试 DbContexts | 更新日期: 2023-09-27 18:15:56

我在应用程序中使用多个DbContext(有界DbContext)。所以我有以下代码:

public class EfUnitOfWork<TContext> : IUnitOfWork where TContext : BaseDbContext, new()
{
   ...
}
//*******************************Module1**************************************
public interface IModule1UnitOfWork:IUnitOfWork
{
}
public class Module1EfUnitOfWork : EfUnitOfWork<Module1DbContext>,IModule1UnitOfWork
{
    public Module1EfUnitOfWork ()
        : base(new Module1DbContext())
    {
    }
}
public class Module1DbContext: BaseDbContext
{
    static Module1DbContext()
    {
        Database.SetInitializer<Module1DbContext>(null);
    }
    public Module1DbContext()
        : base("name=MyDatabase") 
    {
    }    
}
//*******************************Module2**************************************
public interface IModule2UnitOfWork:IUnitOfWork
{
}
public class Module2EfUnitOfWork : EfUnitOfWork<Module2DbContext>,IModule2UnitOfWork
{
    public Module2DbContext()
        : base(new PlanningDbContext())
    {
    }
}
public class Module2DbContext: BaseDbContext
{
    static Module2DbContext()
    {
        Database.SetInitializer<Module2DbContext>(null);
    }
    public Module1DbContext()
        : base("name=MyDatabase") 
    {
    }    
}

我使用StructureMap 3作为我的IoC container,并使用以下代码:

ObjectFactory.Configure(x =>x.For(typeof(IModule1UnitOfWork))
                    .Use(typeof(Module1EfUnitOfWork))
                    .SetLifecycleTo((Lifecycles.Singleton));
                x.For(typeof(IUnitOfWork))
                    .Use(typeof(Module1EfUnitOfWork))
                    .SetLifecycleTo((Lifecycles.Singleton)));
ObjectFactory.Configure(x =>x.For(typeof(IModule2UnitOfWork))
                    .Use(typeof(Module2EfUnitOfWork))
                    .SetLifecycleTo((Lifecycles.Singleton));
                x.For(typeof(IUnitOfWork))
                    .Use(typeof(Module2EfUnitOfWork))
                    .SetLifecycleTo((Lifecycles.Singleton)));

它工作得很好,但是当我想使用这些代码的Integration Test,我有一个问题。我想使用Sql Server CE为我的Integration Test,所以我必须通过我的测试的ConnectionString(指定Sql Server CE数据库文件)到模块的DbContext s,我使用我的模块的DbContexts作为EfUnitOfWork<>类的通用参数,所以它应该有无参数构造函数,但正如你所看到的,我使用我的模块的DbContext无参数构造函数来指定我的数据库:

public Module1DbContext()
    : base("name=MyDatabase");

不能传递任何信息给它。

那么,我如何将现有的DbContext s用于Integration Test呢?

使用有界DbContexts进行集成测试

"name="只指定一个连接字符串,所以它是从app.config文件中读取的间接参数

所以我认为,你应该在测试中使用不同的app.config。