是否可以模拟“数据库”的企业库 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 这样的东西。
这是单元测试采用的形式:
旁白:我还发现静态记录器类的使用非常难以测试。希望我在这里遗漏了一些技巧,但我必须说我对到目前为止的可测试性感到失望。
最佳答案
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/