使用 Microsoft Fakes 模拟数据库

rea*_*404 5 vb.net unit-testing mocking microsoft-fakes

我们目前正在尝试在 VB.NET 项目上实现单元测试,但我们对模拟数据访问方法的最佳方式感到困惑。

我们正在开发 VS2013 Premium,因此我们可以使用Microsoft Fakes。据我的理解,存根和垫片允许(除其他外)短路对数据访问方法的调用,并使它们返回选定的值(或对象或其他)。

在我的研究过程中,我还发现了一个Moq模拟框架,它的行为方式根本不一样:就我的理解而言,整个数据库都被模拟了

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

  1. 我对 Microsoft Fakes 和 Moq 工作原理的理解是否正确?
  2. Microsoft Fakes 和 Moq 2 模拟框架是否具有不同的行为或者它们有不同的目标?
  3. 它们兼容吗?两者是否可以同时使用,有什么价值吗?

可选:您是否有良好的资源来展示使用 Microsoft Fakes 模拟数据访问方法的最佳实践?到目前为止我发现的所有内容都很轻,并且不以 VB.NET 为重点。

TyC*_*obb 5

首先,您在 VB 中找不到很多资源。最好的选择是查看 C# 资源,然后查看此比较图表以了解其大部分功能。忽略许多花哨的语法,只需使用正确的谓词(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 模拟框架是否具有不同的行为或者它们有不同的目标?

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

Fakes 和 Moq 之间最大的区别是 Fakes 使用代码生成来允许存根和填充。对于您需要“伪造”的任何 DLL,您最终都会在单元测试项目中得到 xAssembly.Fakes.dll。

我强烈建议您查看答案,以获取有关假货的详细信息。


它们兼容吗?两者是否可以同时使用,有什么价值吗?

我不明白为什么不。他们都会归还给你看起来像你原来的物品的假物品。您没有理由不能在 Fakes 中创建一个对象并在 Moq 中创建一个对象。被嘲笑的IRepository仍然是IRepository——无论是哪一个创建的。您可以同时玩这两种游戏,看看您更喜欢哪一种。

当处理无法重写但需要测试的旧代码时,Fakes 确实非常好用且方便。能够填充静态(Shared对于 VB)是一个很棒的功能。然而,我确实更喜欢使用最小起订量来编写正常的单元测试,其中静态不发挥作用(因为它们不应该发挥作用)。