可以模拟企业库5版本的“数据库”吗?如果是这样..。怎么做?
这里没有IDatabase界面(这是一个谜,尽管我认为微软P&P会更多地讨论公开这种界面的可测试性的好处)。
我有一个存储类,它使用EntLib 5数据访问应用程序块。
我正在将单元测试追溯到这个类中,并且需要模拟数据库对象上的依赖关系。这个类现在通过其构造函数传递数据库,并使用数据库对象对Db执行操作。
我使用以下方法解析要传递给我的存储库的数据库实例:
Container.RegisterType<IFooRepository, FooRepository>(
new InjectionConstructor(
EnterpriseLibraryContainer.Current.GetInstance<Database>("FooDbConnStr")
)
);我不希望这些单元测试变成集成测试.
我尝试使用Moq创建数据库类型的动态模拟,但事实证明这很棘手,因为数据库需要连接字符串和构造函数中的DbProviderFactory。也许如果有像MockDbProviderFactory这样的东西的话。
这是单元测试采用的形式:

旁白:我还发现静态记录器类的使用很难测试。希望我错过了一些技巧,但我必须说,到目前为止,我对可测试性感到失望。
发布于 2010-08-18 13:41:55
我用了FakeItEasy http://code.google.com/p/fakeiteasy/。
我创建了一个SqlDatabase的模拟(继承自数据库,具有更友好的构造函数),将它传递给FooRepostory,调用正在测试的函数,并断言对数据库的预期调用。
[Test]
public void FooRepo_CallsCorrectSPOnDatabase()
{
var mockDb = A.Fake<SqlDatabase>(x => x.WithArgumentsForConstructor(new object[] { "fakeconnStr" }));
var sut = new FooRepository(mockDb);
sut.LoadFoosById(1);
A.CallTo(() => mockDb.GetStoredProcCommand(Db.SProcs.GetFoosById)).MustHaveHappened(Repeated.Once);
}发布于 2010-08-21 06:25:02
数据库是一个抽象基类,DbProviderFactory也是抽象的,所以您可以将它们都模拟出来。只要您模拟您在数据库类型上调用的操作(几乎所有的操作都是虚拟的,所以您在那里应该很好),您实际上就不需要在提供者工厂中做任何事情。连接字符串可以是空的,也可以是空的,或者是空的。
发布于 2010-12-10 21:21:21
我亲自加载了源代码,并使用ReSharper提取数据库对象的接口。它重建了,我使用了我的自定义二进制文件。哇-一个接口!提示:接口很容易模拟。微软P&P集团为什么不这么做,我不知道。
https://stackoverflow.com/questions/3511130
复制相似问题