什么是嘲弄?
答案 0 :(得分:521)
序言:如果你在字典中查找名词 mock ,你会发现该单词的一个定义是作为模仿的东西。
模拟主要用于单元测试。被测对象可能依赖于其他(复杂)对象。要隔离要通过模拟真实对象行为的模拟替换其他对象的对象的行为。如果将真实对象合并到单元测试中是不切实际的,那么这很有用。
简而言之,模拟是创建模拟真实对象行为的对象。
有时您可能想要区分模拟而不是存根。关于这个主题可能存在一些分歧,但我对存根的定义是一个“最小”的模拟对象。存根实现了足够的行为,允许被测对象执行测试。
模拟就像存根,但测试也会验证被测对象是否按预期调用模拟。部分测试是验证模拟是否正确使用。
举个例子:您可以通过实现一个简单的内存结构来存储记录来存根数据库。然后,测试对象可以读取和写入数据库存根的记录,以允许它执行测试。这可以测试与数据库无关的对象的某些行为,并且仅包含数据库存根以使测试运行。
如果您想要验证被测对象是否将某些特定数据写入数据库,则必须模拟数据库。然后,您的测试将包含有关写入数据库模拟内容的断言。
答案 1 :(得分:28)
网上有很多答案和关于嘲笑的好帖子。你可能想要开始寻找的一个地方是马丁福勒Mocks Aren't Stubs的帖子,他在那里讨论了许多嘲弄的想法。
在一个段落中 - Mocking是一种特殊技术,允许测试代码单元而不依赖于依赖性。一般来说,模拟与其他方法的不同之处在于,用于替换代码依赖关系的模拟对象将允许设置期望 - 模拟对象将知道代码如何调用以及如何响应。
您的原始问题提到了TypeMock,所以我在下面留下了答案:
TypeMock是commercial mocking framework的名称。
它提供了免费模拟框架的所有功能,如RhinoMocks和Moq,以及一些更强大的选项。
你是否需要TypeMock是值得商榷的问题 - 你可以通过免费模拟库进行大多数你想要的模拟,许多人认为TypeMock提供的功能通常会让你远离封装好的设计。
正如另一个答案所说'TypeMocking'实际上并不是一个已定义的概念,但可以用来表示TypeMock提供的模拟类型,使用CLR分析器在运行时拦截.Net调用,从而提供更大的伪造对象能力(不是需要接口或虚拟方法等要求)。
答案 2 :(得分:8)
Mock是一种以受控方式模拟真实方法/对象行为的方法/对象。模拟对象用于单元测试。
测试中的方法通常会调用其中的其他外部服务或方法。这些被称为依赖项。一旦被模拟,依赖关系就像我们定义它们一样。
由于依赖项由模拟控制,我们可以轻松地测试我们编码的方法的行为。这是单元测试。
答案 3 :(得分:5)
模拟类型的目的是切断依赖关系,以便将测试与特定单元隔离开来。存根是简单的代理,而模拟是可以验证使用的代理。模拟框架是一种可以帮助您生成存根和模拟的工具。
编辑:由于原来的措辞提到“类型嘲笑”,我得到的印象是这与TypeMock有关。根据我的经验,一般术语只是“嘲弄”。请随意忽略以下有关TypeMock的信息。
TypeMock Isolator与大多数其他模拟框架的不同之处在于它可以动态修改IL。这允许它模拟大多数其他框架无法模拟的类型和实例。要使用其他框架模拟这些类型/实例,您必须提供自己的抽象并模拟这些。
TypeMock以干净的运行时环境为代价提供了极大的灵活性。作为TypeMock实现其结果的方式的副作用,使用TypeMock时有时会得到非常奇怪的结果。
答案 4 :(得分:3)
我认为使用TypeMock隔离器模拟框架将是TypeMocking。
这是一个生成模拟器以便在单元测试中使用的工具,无需在编写代码时考虑到IoC。
答案 5 :(得分:3)
Mocking正在生成伪对象,模拟测试的真实对象行为
答案 6 :(得分:1)
如果你的模拟涉及网络请求,另一种选择是让真正的测试服务器命中。您可以使用此服务为测试生成请求和响应。 http://testerurl.com/