Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 什么是嘲弄?_Unit Testing_Mocking - Fatal编程技术网

Unit testing 什么是嘲弄?

Unit testing 什么是嘲弄?,unit-testing,mocking,Unit Testing,Mocking,什么是嘲弄?                                                                                                    . 网上有很多关于嘲笑的答案和好帖子。一个你可能想开始寻找的地方是马丁·福勒(Martin Fowler)的帖子,他在那里讨论了许多嘲弄的想法 在一段中,Mocking是一种特殊的技术,它允许在不依赖依赖依赖关系的情况下测试代码单元。一般来说,模拟与其他方法的区别在于,用于替换代码依赖项

什么是嘲弄?                                                                                                    .

网上有很多关于嘲笑的答案和好帖子。一个你可能想开始寻找的地方是马丁·福勒(Martin Fowler)的帖子,他在那里讨论了许多嘲弄的想法

在一段中,Mocking是一种特殊的技术,它允许在不依赖依赖依赖关系的情况下测试代码单元。一般来说,模拟与其他方法的区别在于,用于替换代码依赖项的模拟对象将允许设置期望值——模拟对象将知道代码将如何调用它以及如何响应


你最初的问题提到了TypeMock,所以我将我的答案留在下面:

TypeMock是一个函数的名称

它提供了免费模拟框架的所有功能,如Rhinomock和Moq,以及一些更强大的选项

您是否需要TypeMock是一个很有争议的问题——您可以使用免费的Mock库进行您想要的大多数模拟,许多人认为TypeMock提供的功能通常会使您远离封装良好的设计


正如另一个答案所述,“TypeMock”实际上不是一个定义的概念,但可以理解为TypeMock提供的模拟类型,使用CLR探查器在运行时拦截.Net调用,提供更大的伪造对象的能力(而不是需要接口或虚拟方法等要求).

我认为使用TypeMock隔离器模拟框架将是一种类型模拟


它是一种生成单元测试用模拟的工具,无需在编写代码时牢记IoC。

模拟类型的目的是切断依赖关系,以便将测试隔离到特定单元。存根是简单的代理,而mock是可以验证使用情况的代理。模拟框架是一种工具,可以帮助您生成存根和模拟

编辑:由于最初的措辞提到“类型模拟”,我得到的印象是这与类型模拟有关。根据我的经验,一般术语只是“嘲弄”。请随意忽略以下关于TypeMock的信息

TypeMock隔离器与大多数其他模拟框架的不同之处在于,它可以动态工作。这使得它能够模拟大多数其他框架无法模拟的类型和实例。要用其他框架模拟这些类型/实例,您必须提供自己的抽象并模拟它们


TypeMock提供了极大的灵活性,但牺牲了干净的运行时环境。作为TypeMock实现其结果方式的副作用,当使用TypeMock时,有时会得到非常奇怪的结果

开场白:如果你在字典里查找名词mock,你会发现这个词的一个定义是模仿的

模拟主要用于单元测试。被测物体可能 对其他(复杂)对象具有依赖关系。孤立行为 要用模拟替换其他对象的对象的 模拟真实对象的行为。这是有用的,如果真实的 将对象合并到单元测试中是不切实际的

简而言之,模拟就是创建模拟对象行为的对象 实物

有时,您可能需要区分模仿和存根。在这个问题上可能存在一些分歧,但我对存根的定义是一个“最小”的模拟对象。存根实现了足够的行为,允许被测对象执行测试

模拟类似于存根,但测试还将验证被测对象是否按预期调用了模拟。测试的一部分是验证模拟是否正确使用

举个例子:您可以通过实现一个简单的内存结构来存储记录,从而存根数据库。然后,被测试对象可以将记录读写到数据库存根,以允许它执行测试。这可能会测试与数据库无关的对象的某些行为,并且会包括数据库存根,以便让测试运行


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

mock是一个方法/对象,它以受控方式模拟真实方法/对象的行为。模拟对象用于单元测试

通常,测试下的方法会调用其中的其他外部服务或方法。这些称为依赖项。一旦被模拟,依赖项就会按照我们定义的方式运行

由于依赖关系由mock控制,我们可以轻松地测试我们编码的方法的行为。这是单元测试


如果您的模拟涉及网络请求,另一种选择是使用一个真正的测试服务器。您可以使用服务为测试生成请求和响应。

其他答案解释了模拟是什么。让我用不同的例子介绍一下。相信我,这比你想象的要简单得多

tl;dr它是原始类的一个实例。它向中注入了其他数据,因此您可以避免测试注入的部分,而只关注测试类/函数的实现细节

简单的例子: 如您所见,我没有测试LineA ie,也没有验证输入参数。我不是在验证num1,num2是否是整数。我对此没有异议

我只是测试LineB(我的实现)是否按照我的预期运行,给定模拟值
1
5
class Foo {
    func add (num1: Int, num2: Int) -> Int { // Line A 
        return num1 + num2 // Line B
    }
}

let unit = Foo() // unit under test
assertEqual(unit.add(1,5),6)