使用有界DbContexts进行集成测试

时间:2014-07-31 05:33:28

标签: c# entity-framework sql-server-ce integration-testing structuremap

我在我的应用程序中使用了多个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数据库文件)传递给模块&#39 ; s DbContext s,我使用我的模块DbContexts作为EfUnitOfWork<>类中的通用参数,因此它应该具有无参数构造函数,但正如您所见,我使用了我的模块&# 39;用于指定我的数据库的DbContext无参数构造函数:

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

并且无法传递任何东西。

那么,我怎样才能将现有的DbContext用于Integration Test

1 个答案:

答案 0 :(得分:0)

&#34;名称=&#34;仅指定连接字符串,因此它是从app.config文件中读取的间接参数

所以imho,你应该为你的测试使用不同的app.config。