跳到主要内容
版本:26.x.

Funciones嘲笑

模拟函数允许您通过删除函数的实际实现、捕获对函数的调用(以及在这些调用中传递的参数)、捕获用实例化时的构造函数实例来测试代码之间的链接,并允许测试时间的返回值配置。

模拟函数有两种方法:通过创建模拟函数来在测试代码中使用或编写a<一个href="//www.ieatrice.com/es-ES/docs/manual-mocks">人工模拟重写模块依赖项。

Usando una función mock<一个班级="hash-link" href="#usando-una-función-mock" title="#">#

让我们假设我们正在测试一个函数的实现forEach,它调用提供的阵列中的每个项目的回调。

函数 forEach 项目 回调 {
为了 指数 = 0. ; 指数 < 项目 长度 ; 指数 ++ {
回调 项目 [ 指数 ] ;
}
}

要测试此功能,我们可以使用模拟功能,并检查模拟状态以确保按预期调用回调。

const mockCallback = 笑话 FN. X = > 42. + X ;
forEach [ 0. 1 ] mockCallback ;
//模拟函数被调用两次
预计 mockCallback 模拟 呼叫 长度 成为 2 ;
//对函数的第一个调用的第一个参数为0
预计 mockCallback 模拟 呼叫 [ 0. ] [ 0. ] 成为 0. ;
//第二个函数调用的第一个参数是1
预计 mockCallback 模拟 呼叫 [ 1 ] [ 0. ] 成为 1 ;
//第一次调用函数的返回值是42
预计 mockCallback 模拟 结果 [ 0. ] 价值 成为 42. ;

Propiedad.。嘲笑

所有模拟功能都有这个特殊。嘲笑属性,这是关于如何调用函数的数据以及保留返回的函数的数据。这。嘲笑财产也跟踪价值这个对于每个呼叫,所以也可以检查一下:

const m = 笑话 FN. ;
const 一个 = m ;
const B. = { } ;
const 边界 = m 捆绑 B. ;
边界 ;
控制台 日志 m 模拟 实例 ;
// > []

这些模拟成员在测试中非常有用,可以断言这些函数如何被调用、实例化或它们返回什么:

//函数被调用一次
预计 SomeMockFunction. 模拟 呼叫 长度 成为 1 ;
//第一次调用该函数的arg是'第一个arg'
预计 SomeMockFunction. 模拟 呼叫 [ 0. ] [ 0. ] 成为 '第一次arg' ;
//第一次调用函数的第二个参数是'second arg'
预计 SomeMockFunction. 模拟 呼叫 [ 0. ] [ 1 ] 成为 '第二个arg' ;
//第一次调用函数的返回值是'return value'
预计 SomeMockFunction. 模拟 结果 [ 0. ] 价值 成为 '返回值' ;
//此函数已完全两次实例化
预计 SomeMockFunction. 模拟 实例 长度 成为 2 ;
//由此函数的第一次实例化返回的对象
//有一个“名称”属性,其值被设置为“测试”
预计 SomeMockFunction. 模拟 实例 [ 0. ] 姓名 toequal. '测试' ;

Simular Valores de Retorno<一个班级="hash-link" href="#simular-valores-de-retorno" title="#">#

模拟函数也可用于在测试期间将测试值注入您的代码:

const myMock = 笑话 FN. ;
控制台 日志 myMock ;
//>未定义
myMock mockreturnvalueonce. 10. mockreturnvalueonce. 'X' mockReturnValue 真正的 ;
控制台 日志 myMock myMock myMock myMock ;
// 10, 'x', true, true

模拟函数在使用函数延续传递风格的代码中也非常有效。用这种风格编写的代码有助于避免对复杂存根的需要,这些存亚搏取款根重新创建它们所代表的真实组件的行为,有利于在使用它们之前直接将值注入测试。

const filtertestfn. = 笑话 FN. ;
//使模拟返回'true`为第一个通话,
//和“假呼叫”和“假”
filtertestfn. mockreturnvalueonce. 真正的 mockreturnvalueonce. 错误的 ;
const 结果 = [ 11. 12. ] 过滤器 全国矿工工会 = > filtertestfn. 全国矿工工会 ;
控制台 日志 结果 ;
/ / > [11]
控制台 日志 filtertestfn. 模拟 呼叫 ;
//> [[11],[12]]

大多数真实世界的例子实际上涉及在依赖于组件上获得模拟函数并配置此功能,但该技术是相同的。在这些情况下,尝试避免诱惑在任何未直接测试的功能内实现逻辑。

嘲笑模块<一个班级="hash-link" href="#mocking-modules" title="#">#

假设我们有一个从API获取用户的类。这个类使用<一个href="https://github.com/axios/axios" target="_blank" rel="noopener noreferrer">axios调用API,然后返回数据属性包含所有用户:

//用户.js.
进口 axios 'Axios' ;
班级 用户 {
静态的 所有 {
返回 axios 得到 '/users.json' 然后 分别地 = > 分别地 数据 ;
}
}
出口 默认 用户 ;

现在,为了在没有实际击中API的情况下测试此方法(因此产生缓慢和脆弱的测试),我们可以使用jest.mock(...)功能自动模拟AXIOS模块。

一旦我们模拟了模块,我们就可以提供一个mockresolvedvalue.为了。得到返回我们希望考试的数据返回对反对的数据。实际上,我们说我们想要Axios.get('/ users.json')返回假响应。

//用户.test.js.
进口 axios 'Axios' ;
进口 用户 './users' ;
笑话 模拟 'Axios' ;
测试 “应该获取用户的 = > {
const 用户 = [ { 姓名 “鲍勃” } ] ;
const 分别地 = { 数据 用户 } ;
axios 得到 mockresolvedvalue. 分别地 ;
//根据你的用例,你可以使用以下方法:
// axios.get.mockimplementation(()=> prusion.resolve(RESP))
返回 用户 所有 然后 数据 = > 预计 数据 toequal. 用户 ;
} ;

ImportingAciones de simulaciones模拟<一个班级="hash-link" href="#implementaciones-de-simulaciones-mock" title="#">#

此外,还有一个案例,超出了指定返回值的能力和全面替换模拟函数的实现。这可以完成jest.fn.或者是模仿once模拟函数的方法。

const myMockFn = 笑话 FN. CB. = > CB. 真正的 ;
myMockFn 犯错 = > 控制台 日志 ;
//>真实

mockImplementation当您需要定义从另一个模块创建的模拟函数的默认实现时,方法很有用:

/ / foo.js
模块 出口 = 函数 {
//一些实施;
} ;
// test.js.
笑话 模拟 '../foo' ; //通过automocking自动实现
const Foo = 要求 '../foo' ;
// foo是模拟功能
Foo mockImplementation = > 42. ;
Foo ;
/ / > 42

当您需要重新创建模拟功能的复杂行为,使多个函数调用产生不同的结果,请使用模仿once方法:

const myMockFn = 笑话
FN.
模仿once CB. = > CB. 真正的
模仿once CB. = > CB. 错误的 ;
myMockFn 犯错 = > 控制台 日志 ;
//>真实
myMockFn 犯错 = > 控制台 日志 ;
//>假

当被模拟的函数用完定义的实现时模仿once,它将执行默认实现集合jest.fn.(如果定义):

const myMockFn = 笑话
FN. = > “默认”
模仿once = > “第一个电话”
模仿once = > “第二个电话” ;
控制台 日志 myMockFn myMockFn myMockFn myMockFn ;
//>'第一次打电话','第二个电话','默认','默认'

在这种情况下,我们的方法通常是链接的(因此总是需要返回)这个),我们有一个含义的API,以简化这种形式.mockreturnthis()函数也位于所有模拟对象上:

const myObj = {
myMethod 笑话 FN. MockReturnthis.
} ;
// 是相同的
const otherObj = {
myMethod 笑话 FN. 函数 {
返回 这个 ;
}
} ;

Burlasse de los Nombres<一个班级="hash-link" href="#burlarse-de-los-nombres" title="#">#

您可以选择为模拟函数提供名称,这将在测试错误输出中显示它而不是“JEST.FN()”。如果要快速识别测试输出中的错误函数报告错误,请使用此功能。

const myMockFn = 笑话
FN.
mockReturnValue “默认”
mockImplementation 标量子 = > 42. + 标量子
mockname. 'Add42' ;

匹配者丛<一个班级="hash-link" href="#matchers-comunes" title="#">#

最后,为了使得苛刻的要求苛刻致力于调用模拟函数,我们为您添加了一些自定义匹配功能:

//至少调用Mock函数
预计 Mockfunc. toHaveBeenCalled ;
//使用指定的args至少调用Mock函数
预计 Mockfunc. toHaveBeenCalledWith arg1. arg2. ;
//使用指定的args调用对模拟函数的最后一个调用
预计 Mockfunc. tohavebeenlastcalledwith. arg1. arg2. ;
//所有调用和mock的名称都被写入快照
预计 Mockfunc. tomatchsnapshot. ;

这些匹配器是常用的检查形式的糖。嘲笑财产。如果这更符合你的口味,或者你需要做一些更具体的事情,你可以自己手动做:

//至少调用Mock函数
预计 Mockfunc. 模拟 呼叫 长度 toBeGreaterThan 0. ;
//使用指定的args至少调用Mock函数
预计 Mockfunc. 模拟 呼叫 tocontainequal. [ arg1. arg2. ] ;
//使用指定的args调用对模拟函数的最后一个调用
预计 Mockfunc. 模拟 呼叫 [ Mockfunc. 模拟 呼叫 长度 - 1 ] toequal. [
arg1.
arg2.
] ;
//上次调用模拟函数的第一个arg是`42`
//(注意,对于这个特定的断言没有糖助手)亚搏取款
预计 Mockfunc. 模拟 呼叫 [ Mockfunc. 模拟 呼叫 长度 - 1 ] [ 0. ] 成为 42. ;
//一个快照将检查模拟的次数是否相同次数,
//以相同的顺序,具有相同的参数。TambiénAfiriramaránEl·奥尔布勒。
预计 Mockfunc. 模拟 呼叫 toequal. [ [ arg1. arg2. ] ] ;
预计 Mockfunc. getmockname. 成为 “一个模拟的名字” ;

Para Una Lista Completa De Matchers,VéaseLOSdocumentos de Regectencia<一个href="/es-ES/docs/expect">参考文档yabo2013。