c# - 模拟企业 Lib 5 'Database'

标签 c# .net unit-testing enterprise-library

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

没有 IDatabase 接口(interface)(这是一个谜,因为我认为 Microsoft P&P 更关注公开此类接口(interface)的可测试性优势)。

我有一个使用 EntLib 5 数据访问应用程序 block 的存储库类。

我正在将单元测试 retrofit 到此类中,并且需要模拟出对数据库对象的依赖性。此类现在通过其构造函数传递给数据库,并使用数据库对象对 Db 执行操作。

我使用以下方法解析要传递到我的存储库的数据库实例:

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

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

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

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

EntLib UnitTest Attempt to Mock Database

旁白:我还发现静态记录器类的使用非常难以测试。希望我在这里遗漏了一些技巧,但我必须说我对到目前为止的可测试性感到失望。

最佳答案

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# - 模拟企业 Lib 5 'Database',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3511130/

相关文章:

.net - 椭圆绘图 WPF 动画

python - Teamcity 消息 unittest 在 Python 2 中看不到测试

javascript - Jest Uncovered Lines - 我如何测试这些线..?

c# - 软件自动更新

c# - 如何让 EventLog 将用户名记录到 Window 事件日志中?

c# - 将 System.Drawing.Color 转换为 RGB 和十六进制值

c# - 将证书添加到 x509Store 不会执行任何操作 C#

c# - 在部分限制器/短语之间获取文本

c# - 用于控制 OWI-535 机械臂的 API

unit-testing - 测试持续集成的分支是什么?