什么是嘲笑?

什么是嘲笑? 。

序言:如果你在字典中查找名词模拟 ,你会发现这个词的定义之一是模仿


嘲笑主要用于unit testing。 被测对象可能依赖于其他(复杂)对象。 要隔离要testing的对象的行为,请使用模拟实际对象行为的模拟replace其他对象。 如果真实对象不适合纳入unit testing,这是非常有用的。

简而言之,嘲讽正在创造模拟真实物体行为的物体。


有时你可能想区分嘲笑 ,而不是嘲笑 。 这个问题可能会有一些分歧,但是我对存根的定义是一个“最小”的模拟对象。 存根实现了足够的行为以允许被测对象执行testing。

一个模拟就像一个存根,但testing也将validation被测对象如预期的那样调用模拟。 部分testing正在validation模拟使用正确。

举个例子:你可以通过实现一个简单的内存结构来存储logging来存根数据库。 被testing的对象然后可以读取和写入logging到数据库存根以允许它执行testing。 这可以testing与数据库不相关的对象的一些行为,并且将包括数据库存根以便让testing运行。

如果您不想validation被测对象是否将某些特定数据写入数据库,则必须模拟数据库。 然后,您的testing将包含有关写入数据库模拟内容的断言。

在网上有很多答案,并在网上有关嘲笑的好post。 你可能要开始寻找的一个地方是Martin Fowler Mocks不是存根(Stubs) ,他讨论了很多嘲笑的想法。

在一个段落中 – 模拟是一种特殊的技术,它允许testing一个代码单元而不依赖于依赖关系。 一般来说,与其他方法相区别的是,用于replace代码依赖关系的模拟对象将允许设置期望 – 模拟对象将知道代码如何调用以及如何响应。


你原来的问题提到TypeMock,所以我留下了我的答案如下:

TypeMock是商业模拟框架的名称。

它提供了像RhinoMocks和Moq这样的免费模拟框架的所有function,以及一些更强大的选项。

无论你是否需要TypeMock都是非常值得商榷的 – 你可以用免费的嘲讽库去做最嘲笑的事情,而且很多人认为TypeMock提供的function会让你远离封装好的devise。

正如另一个回答所述,“TypeMocking”实际上并不是一个定义的概念,但可以被认为是TypeMock提供的嘲笑types,使用CLR分析器在运行时拦截.Net调用,赋予虚假对象更多的能力如需要接口或虚拟方法)。

其他答案解释了嘲笑是什么。 让我以一个例子来引导你。 相信我,这实际上比你想象的要简单得多。

tl; dr它是原始类的一个子类。 它有其他的数据注入,所以你避免testing注入的部分,只专注于testing代码的其余部分。


假设您正在编写iOS应用程序并进行networking调用。 您的工作是testing您的应用程序。 testing/确定networking调用是否按预期工作不是您的义务。 testing它是另一方的责任。 你必须删除这个(networking)依赖,然后继续testing你所有的代码。

networking调用可以用JSON响应返回不同的状态码404,500,200,303等。

你的应用程序是为所有人工作(如果出现错误,你的应用程序应该抛出预期的错误)。 你所做的嘲弄是你创build'假想 – 类似于真实'的networking响应(就像一个带有JSON文件的200代码),并且不用“进行真正的networking调用并等待你的networking响应”来testing你的代码。 您可以手动硬编码/返回所有不同种类的networking响应,并查看您的应用是否按预期工作。 (你从不假设/testing一个200数据不正确,因为这不是你的责任,你的责任是用一个正确的200testing你的应用程序,或者如果你的应用程序抛出正确的错误,

这种与真实相似的想象被称为嘲弄。

为了做到这一点,你不能使用你的原始代码(你原来的代码没有预先插入的回应,对吗?)。 你必须添加一些东西,注入/插入通常不需要的虚拟数据(或你的class级的一部分)。

所以你SUBCLASS原来的类和添加什么(这里是networkingHTTPResponse,数据或在失败的情况下,你传递正确的errorString,HTTPResponse)你需要它,然后'testing子类'即模拟类。
你不再testing原来的课程。 模拟/子类是代表原来的类进行testing

长话短说,嘲笑是简化限制你正在testing的东西,也让你喂养一个class级所依赖的。 在这个例子中,你避免自己 testing networking调用 ,而是testing你的应用程序是否像你期望的那样使用注入的输出/响应来testing – 通过mocking

不用说,你分别testing每个networking响应。


仅适用于iOS开发人员:

嘲笑的一个非常好的例子是Natasha Muraschev的这个实用的面向协议的谈话。只需跳到18:30分钟。

我真的很喜欢这个部分的成绩单:

因为这是testing…我们确实要确保Gettableget函数被调用, 因为它可以返回,函数可以在理论上从任何地方分配一个食物项目的数组 。 我们需要确保它被称为;

模拟是一种以受控方式模拟真实方法/对象行为的方法/对象。 模拟对象用于unit testing。

testing下的某个方法通常会调用其他外部服务或方法。 这些被称为依赖关系。 一旦被嘲笑,依赖就像我们定义它们的方式一样。

通过mock控制依赖关系,我们可以很容易地testing我们编写的方法的行为。 这是unit testing。

模拟对象的目的是什么?

嘲笑存根(stubs)

unit testing与functiontesting

嘲讽types的目的是断绝依赖关系,以便将testing隔离到特定单元。 存根是简单的替代品,而嘲笑是可以validation使用情况的替代品。 嘲笑的框架是一个工具,将帮助您生成存根和嘲笑。

编辑 :由于原来的措辞提到“types嘲讽”我得到了这个与TypeMock有关的印象。 根据我的经验,这个总称只是“嘲弄”。 请随意忽略TypeMock上的以下信息。

TypeMock Isolator与其他大多数的嘲讽框架不同,它可以在运行中修改IL。 这使得它可以模拟大多数其他框架无法模拟的types和实例。 要嘲笑这些types/实例与其他框架,你必须提供自己的抽象和嘲笑这些。

TypeMock以一个干净的运行时环境为代价提供了极大的灵活性。 作为TypeMock实现其结果的一个副作用,当使用TypeMock时,您有时会得到非常奇怪的结果。

我会认为使用TypeMock隔离器嘲讽框架将是TypeMocking。

它是一个生成模块以用于unit testing的工具,而不需要用IoC来编写代码。

如果您的模拟涉及networking请求,另一种select是有一个真正的testing服务器打。 您可以使用此服务为您的testing生成请求和响应。 http://testerurl.com/

模拟正在生成模拟真实对象的testing行为的伪对象