我们正在开发VS2013 Premium,因此我们可以使用Microsoft Fakes.据我所知,Stubs和Shims允许 – 其他一些东西 – 短路调用数据访问方法并使它们返回一个选定的值(或对象或其他).
在我的研究过程中,我还发现了一个Moq模拟框架,它根本不采用相同的方式:就我的理解而言,整个数据库都是模拟的.
从这些观察中,我几乎没有问题:
>我对Microsoft Fakes和Moq如何工作的理解是否正确?
> Microsoft Fakes和Moq 2模拟框架具有不同的行为,还是他们有不同的目标?
>它们兼容吗?是否可以同时使用它们,它是否有任何价值?
Optionnally:你有很好的资源显示使用Microsoft Fakes模拟数据访问方法的最佳实践吗?直到现在我发现的一切都很轻松,而不是VB.NET专注.
首先,你不会在VB中找到很多资源.最好的选择是查看C#资源,然后查看这个 comparison chart以查看其中的大部分内容.忽略很多花哨的语法,只是使用正确的谓词(Function(x)/ Sub(x)而不是x => …)来实例化和填充参数.我对Microsoft Fakes和Moq如何工作的理解是否正确?
关.根据你的问题的措辞,听起来你认为Moq或Fakes会模拟一个真正的数据库.它不会让你成为假的数据库(SQL / Raven /等).它的作用是为你创造一个你需要的模拟对象.
因此,如果您有一个Repository类,则可以将其设置为返回代理.它可能看起来像你的类型和工作类型,但它是类型的“假”或“模拟”.这就是您可以强制返回特定值的原因.这意味着如果你有一个PersonRepository,其方法是Find(personId)As Person,你可以让它返回一个Person的新实例(或模拟),其中包含测试所需的数据.您可以指定所需内容.它不会连接到数据库,并且通常在Find中的代码将无法运行,因为您没有真正获得PersonRepository的真实实例,但当然是基于您告诉它设置的模拟.
Microsoft Fakes和Moq 2模拟框架是否具有不同的行为,或者它们有不同的目标吗?
他们有着接近相同的目标,但工作完全不同.两者都有利弊.人们更倾向于微软Fakes的主要原因之一是Shims.垫片允许模拟静态和共享.据我所知,只有Fakes和其他花钱的第三方框架才有这个功能.
Fakes和Moq之间最大的区别在于Fakes使用代码生成来允许存根和填充.您将在单元测试项目中使用xAssembly.Fakes.dll来获取“伪造”所需的任何DLL.
我强烈建议查看this答案以获取有关假货的详细信息.
它们兼容吗?是否可以同时使用它们,它是否有任何价值?
我不明白为什么不.他们都会给你一些看起来像原始物品的假物品.没有理由你不能在Fakes中创建一个对象而在Moq中创建一个对象.模拟的IRepository仍然是一个IRepository – 无论哪个创建它都无关紧要.你可以同时玩这两个,看看你喜欢哪一个.
使用旧代码无法重写时,假装非常好用,但需要测试.能够填充静态(Shared for VB)是一个很棒的功能.但是,我更喜欢Moq用于正常的单元测试编写,其中静态不起作用(因为它们不应该).