c# – 模拟Enterprise Lib 5’数据库’

是否可以模拟企业库5版的“数据库”?如果是这样……怎么样?

没有IDatabase接口(这是一个谜,因为我虽然微软P& P将更多关于暴露这种接口的可测试性优势).

我有一个使用EntLib 5数据访问应用程序块的Repository类.

我将单元测试改编成这个类,需要模拟出对Database对象的依赖.此类现在通过其构造函数传递给数据库,并使用Database对象在Db上执行操作.

我使用以下内容来解析要传递给我的存储库的数据库实例:

Container.RegisterType<IFooRepository, FooRepository>(
    new InjectionConstructor(
        EnterpriseLibraryContainer.Current.GetInstance<Database>("FooDbConnStr")
    )
);

我不希望这些单元测试成为集成测试.

我已经尝试使用Moq来创建数据库类型的动态模拟,但事实证明这很棘手,因为数据库需要在其构造函数中使用连接字符串和DbProviderFactory.也许如果有像MockDbProviderFactory这样的东西.

这是单元测试采用的形式:

旁白:我还发现使用静态记录器类很难测试.希望我在这里缺少一些技巧,但我必须说到目前为止我对可测试性感到失望.

最佳答案
FWIW,我能够使用Moq模拟一个SqlDatabase. SqlDatabase具有SqlClientPermission属性,该属性与Castle Windsor(由Moq使用)不兼容.我必须明确地指示Castle忽略SqlClientPermission属性以使测试起作用(参见下面示例中的第1行).下面是一个单元测试样本(借用Steven H的例子).

    [TestMethod]
    public void FooRepo_CallsCorrectSPOnDatabase()
    {
        Castle.DynamicProxy.Generators.AttributesToAvoidReplicating.Add(typeof(System.Data.SqlClient.SqlClientPermissionAttribute));
        var mockSqlDb = new Mock<SqlDatabase>("fake connection string");
        mockSqlDb.Setup(s => s.GetStoredProcCommand("sp_GetFoosById"));
        var sut = new FooRepository(mockSqlDb);
        sut.LoadFoosById(1);
        mockSqlDb.Verify(s => s.GetStoredProcCommand("sp_GetFoosById"), Times.Once(), "Stored Procedure sp_GetFoosById was not invoked.");
    }

转载注明原文:c# – 模拟Enterprise Lib 5’数据库’ - 代码日志