角色与间谍的间谍

问题描述 投票:4回答:3

我是Angular的新手,正在进行单元测试。

我试图证实我对Fakes vs Spies(spyOn)的理解。

我的理解是Fakes允许你模拟实际上没有从服务返回的数据。它只是模拟它从服务传递。

另一方面,间谍让你实际调用或监视一项服务并获得一个真实的结果,以便在你的测试中进行比较。

我对么?

angular jasmine
3个回答
5
投票

这里有一些信息可以帮助您改善差异:

虚拟对象传递但从未实际使用过。通常它们仅用于填充参数列表。

假对象实际上有工作实现,但通常需要一些使它们不适合生产的快捷方式(内存数据库就是一个很好的例子)。

存根提供了在测试期间进行的调用的固定答案,通常不会对测试中编程的任何内容做出任何响应。

间谍是根据它们被调用的方式记录一些信息的存根。其中一种形式可能是电子邮件服务,它记录发送的邮件数量。

模拟是我们在这里所讨论的:预编程的对象具有预期,形成了预期接收的调用的规范。

Long article here

现在您知道存根和间谍之间有什么区别,这里有更多信息可以解释它更好:)

测试double是一个可以代表测试中的真实对象的对象,类似于特技双重代表电影中的演员。这些通常都被称为“模拟”,但重要的是要区分不同类型的测试双打,因为它们都有不同的用途。最常见的测试双打类型是存根,模拟和伪造。

存根没有逻辑,只返回您告诉它返回的内容。当您需要一个对象返回特定值以使您的测试代码进入某个状态时,可以使用存根。虽然手动编写存根通常很容易,但使用模拟框架通常是减少样板的便捷方法。

模拟对它应该被调用的方式有期望,如果没有这样调用,测试应该失败。模拟用于测试对象之间的交互,并且在没有其他可见状态更改或返回可以验证的结果的情况下非常有用(例如,如果您的代码从磁盘读取并且您希望确保它不会超过磁盘一个磁盘读取,您可以使用模拟来验证执行读取的方法只被调用一次)。

假的不使用模拟框架:它是API的轻量级实现,其行为类似于真实的实现,但不适合生产(例如内存数据库)。当您无法在测试中使用真正的实现时(例如,如果实际实现太慢或通过网络进行通信),可以使用伪造。您不应该经常编写自己的假货,因为假货通常应由拥有真实实施的个人或团队创建和维护。

Code examples here


1
投票

这就是我学到并实践过的......在这里记下来帮助某人......要求专家帮助对此进行更正/编辑以改进它。

  • PREMISE:我们想测试调用服务的组件
  • 呼叫实际服务

它的作用:“从服务中调用实际属性,方法”最好在以下情况下使用:“想用我们的组件测试实际服务”

  • 与假类别的模拟

它的作用“我们创建自己的'模拟'服务,我们在其中定义每个内容......注意:我们需要确保在定义模拟类时包含原始服务中的所有属性/方法”当“我们可能不知道服务的内部工作原理时,我们可能不关心。我们用所有属性/方法创建我们自己的服务来返回我们想要的结果,并且主要想测试我们的组件以测试它的功能对抗服务结果“

  • 模仿一个类

它做什么“我们'扩展'原始服务,我们可以选择从原始服务中选择一个或多个方法/属性,并可以选择自己添加/编辑一个或多个方法/属性”最好在“我们何时使用”不知道服务的内部工作方式,我们可能不在乎,但为了避免使用假类进行模拟并创建每个方法/属性,我们扩展到只创建我们的测试所需的方法/属性版本“

  • 与间谍交配

它做什么“一个间谍返回值,好像我们调用了实际服务,间谍没有关心/接触服务这样做 - 当我们调用我们的组件(访问此服务)而不是调用实际服务时,它使用该值当我们想要从我们服务的特定方法中返回特定值时,从我们的间谍“最好使用时”返回 - 这个特定的结果将由我们的组件用于其测试“


0
投票

有很多方法可以做到这一点。

我将用简单的术语给你答案。假设你有一个带有函数foo()的服务myService。 Foo函数返回你的名字。

现在你将spyon myService.foo()。这是为了得到关于函数foo的外部细节,即一旦你开始监视函数你可以得到调用函数的次数,传递给函数的值或参数,你甚至可以明确地让foo()返回你选择的值。这些都是用茉莉花间谍来完成的。

现在有一个模拟,这只是你提供的虚假数据。例如,相同的服务foo()返回您的名字。你为myService编写了一个虚假的服务模拟(并将其命名为myServiceMock)并返回函数foo()的另一个名称。然后你希望它失败。

因此模拟是相同的功能,但它返回您的愿望的值,因此您可以通过测试失败并通过许多场景。

我希望这有帮助。简单来说,这些是模拟和间谍之间的差异。

© www.soinside.com 2019 - 2024. All rights reserved.