使用Microsoft Fakes模拟数据库

时间:2014-12-02 16:12:10

标签: vb.net unit-testing mocking microsoft-fakes

我们目前正在尝试在VB.NET项目上实现单元测试,但我们不得不考虑模拟数据访问方法的最佳方法。

我们正在开发VS2013 Premium,因此我们可以使用 Microsoft Fakes 。据我所知,Stubs和Shims允许 - 其他一些东西 - 短路调用数据访问方法,并使它们返回一个选定的值(或对象或其他)。

在我的研究过程中,我还发现了一个 Moq 模拟框架,它根本没有同样的行为:据我的理解仍然是,整个数据库是嘲笑

根据这些观察,我几乎没有问题:

  1. 我对Microsoft Fakes和Moq如何工作的理解是否正确?
  2. Microsoft Fakes和Moq 2模拟框架具有不同的行为,还是有不同的目标?
  3. 它们兼容吗?是否可以同时使用它们,它是否有任何价值?
  4. Optionnally:你有很好的资源显示使用Microsoft Fakes模拟数据访问方法的最佳实践吗?我到目前为止所发现的一切都很轻松,而不是VB.NET。

2 个答案:

答案 0 :(得分:4)

首先,你不会在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的真实实例,但当然是 mock < / strong>基于你告诉它设置的内容。


Microsoft Fakes和Moq 2模拟框架具有不同的行为,还是他们有不同的目标?

他们接近相同的目标,但工作完全不同。两者都有利弊。人们更倾向于微软Fakes的主要原因之一是 Shims 。垫片允许模仿staticShared。据我所知,只有Fakes和其他花钱的第三方框架才有这个功能。

Fakes和Moq之间的最大区别在于Fakes使用代码生成来允许存根和填充。您将在单元测试项目中使用xAssembly.Fakes.dll来获取“伪造”所需的任何DLL。

我强烈建议您查看this答案,了解有关假货的详细信息。


它们兼容吗?是否可以同时使用它们,它是否有任何价值?

我不明白为什么不。他们都会给你一些看起来像原始物品的假物品。没有理由你不能在Fakes中创建一个对象而在Moq中创建一个对象。被模拟的IRepository仍然是IRepository - 无论哪个创建它。你可以同时玩这两个,看看你喜欢哪一个。

在使用无法重写的旧代码但需要测试时,伪造非常好用。能够填充静态(VB的Shared)是一个很棒的功能。但是,我更喜欢Moq用于正常的单元测试编写,其中静态不起作用(因为它们不应该)。

答案 1 :(得分:1)

我广泛使用了Microsoft Fakes框架,但对Moq

并不多

1)微软假装框架允许嘲笑几乎任何东西。静态类,静态方法,私有方法,.Net框架方法......都可以被嘲笑。伪造框架无法模仿的东西很少。 Moq主要用于模拟接口。它可以模拟未密封的类。但它不能模拟静态方法和Fakes可以嘲笑的所有其他东西。 从这个意义上讲,Fakes框架比Moq更强大

回答有关数据库的问题,我们使用Linq to Sql作为我们的ORM。 我们创建了一个名为&#39; MemoryDataContext&#39;使用T4模板。我们使用MemoryDataContext将对数据库的调用短路。

有可用于模拟DBContext(实体框架)和datacontext

的工具