gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:30:52 25 4
gpt4 key购买 nike

是否可以模拟“数据库”的企业库 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com