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

模拟数

Mock andify允许你测试代码之间的连接 - 实现方向包括:擦除幂的实际实现,捕获对幂的使用(在使用新的实例化时捕获构造函,允许测试时配置返回值。

有两两方法可致幂:要么在测试代码中创建一个模拟,要么编写一<一种href="//www.ieatrice.com/zh-Hans/docs/manual-mocks">动手嘲笑来覆盖模块依赖。

使用作嘲弄<一种班级="hash-link" href="#使用-mock-函数" title="#">#

假设我们要测试数Foreach.的内部实现,这个这个数为传入的数量。

功能 Foreach. 项目 打回来 {
为了 指数 = 0. ; 指数 < 项目 长度 ; 指数 ++ {
打回来 项目 [ 指数 ] ;
}
}

适用于测试此数,我们可以使用一个模拟次数,然后检查模拟数量的状态来源如如寿命。

const 模仿 = 笑话 FN. X => 42. + X ;
Foreach. [ 0. 1 ] 模仿 ;
//此模拟分数被调了次
预计 模仿 嘲笑 呼叫 长度 成为 2 ;
//第一个次调用处数时的第一来幂数是0
预计 模仿 嘲笑 呼叫 [ 0. ] [ 0. ] 成为 0. ;
//第二次의调用数量时分的第一钉子数量是1
预计 模仿 嘲笑 呼叫 [ 1 ] [ 0. ] 成为 1 ;
//第一个次闻分数使用的是42
预计 模仿 嘲笑 结果 [ 0. ] 价值 成为 42. ;

。嘲笑属性<一种班级="hash-link" href="#mock-属性" title="#">#

没有的模拟乐队有这个特价的。嘲笑属性,它保存了关键词如何如何被调调使用,使用时的返回值的信息。。嘲笑属性还追踪每次次使用时的值,所以我们同样可也检视(检查)

const mymock. = 笑话 FN. ;
const 一种 = 新的 mymock. ;
const B. = { } ;
const 边界 = mymock. 捆绑 B. ;
边界 ;
安慰 日志 mymock. 嘲笑 实例 ;
//> []

这些嘲弄成员销上在测试中间有用的,用来说明这些函数是如何如何调调用,实例化迹象的:

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

嘲笑的返回返回<一种班级="hash-link" href="#mock-的返回值" title="#">#

Mock andifies也可口用途在测试晚期将测试值注入︰

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="#模拟模块" title="#">#

假定有个从API获取用作的类。该该用<一种href="https://github.com/axios/axios" target="_blank" rel="noopener noreferrer">轴使用API​​然后返回数据,其中包含有用的属性:

//用户.js.
进口 'Axios' ;
班级 用户 {
静态的 全部 {
返回 得到 '/users.json' 然后 resp => resp 数据 ;
}
}
出口 默认 用户 ;

在所谓的,为之了,而不是实际调使用API​​(使测试缓慢脆弱),我们可以用作jest.mock(...)函数自动模拟Axios模块

一件事,我们可以。得到提供一饰mockresolvedvalue.,它会返回假数据用来于。实际上,我们说我们想要Axios.get('/ users.json')返回假响应。

//用户.test.js.
进口 'Axios' ;
进口 用户 './users' ;
笑话 嘲笑 'Axios' ;
测试 '应该取消用户' => {
const 用户 = [ { 姓名 '鲍勃' } ] ;
const resp = { 数据 用户 } ;
得到 mockresolvedvalue. resp ;
//或者您可以根据您的用例使用以下内容:
// axios.get.mockimplementation(()=> prusion.resolve(RESP))
返回 用户 全部 然后 数据 => 预计 数据 toequal. 用户 ;
} ;

模拟实现<一种班级="hash-link" href="#mock-实现" title="#">#

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

const mymockfn. = 笑话 FN. CB. => CB. 空值 真的 ;
mymockfn. => 安慰 日志 ;
//>真实

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

// foo.js.
模块 出口 = 功能 {
//一些实施;
} ;
// test.js.
笑话 嘲笑 '../foo' ; //这将自动使用automocking
const Foo = 要求 '../foo' ;
// foo是模拟功能
Foo 模仿 => 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. = {
迈运 笑话 FN. MockReturnthis.
} ;
// 是相同的
const 其他 = {
迈运 笑话 FN. 功能 {
返回 ;
}
} ;

嘲弄名字<一种班级="hash-link" href="#mock-名称" title="#">#

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

const mymockfn. = 笑话
FN.
mockreturnvalue. '默认'
模仿 标量子 => 42. + 标量子
mockname. 'Add42' ;

自给力器<一种班级="hash-link" href="#自定义匹配器" title="#">#

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

//至少调用Mock函数
预计 Mockfunc. TohaveBeencalled. ;
//使用指定的args至少调用Mock函数
预计 Mockfunc. Tohavebeencalledwith. arg1. arg2. ;
//使用指定的args调用对模拟函数的最后一个调用
预计 Mockfunc. tohavebeenlastcalledwith. arg1. arg2. ;
//所有呼叫和模拟的名称被写为快照
预计 Mockfunc. tomatchsnapshot. ;

这些匹配者是用于检查的常用形式的糖。嘲笑财产。如果这对您的品味越多,或者如果您需要更具体的事情,您可以随时为自己做到这一点:如果您的口味更好,或者您需要做更多特定的事情

//至少调用Mock函数
预计 Mockfunc. 嘲笑 呼叫 长度 tobegreathan 0. ;
//使用指定的args至少调用Mock函数
预计 Mockfunc. 嘲笑 呼叫 tocontainequal. [ arg1. arg2. ] ;
//使用指定的args调用对模拟函数的最后一个调用
预计 Mockfunc. 嘲笑 呼叫 [ Mockfunc. 嘲笑 呼叫 长度 - 1 ] toequal. [
arg1.
arg2.
] ;
//上次调用模拟函数的第一个arg是`42`
//(请注意,这种断言的特定没有糖助助手)亚搏取款
预计 Mockfunc. 嘲笑 呼叫 [ Mockfunc. 嘲笑 呼叫 长度 - 1 ] [ 0. ] 成为 42. ;
//一个快照将检查模拟的次数是否相同次数,
//以相同的顺序,具有相同的参数。它还会在名为上断言。它还会在名为上断言。
预计 Mockfunc. 嘲笑 呼叫 toequal. [ [ arg1. arg2. ] ] ;
预计 Mockfunc. getmockname. 成为 '模拟' ;

仪器的完整完整,请请<一种href="//www.ieatrice.com/zh-Hans/docs/expect">参考文档。