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

Funcţiipentru dubluri.

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

模拟函数有两种方法:通过创建模拟函数来在测试代码中使用或编写a<一种href="//www.ieatrice.com/ro/docs/manual-mocks">手动模拟覆盖模块依赖性。

Utilizarea UneiFuncţii模拟<一种班级="hash-link" href="#utilizarea-unei-funcţii-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. ;

祖国。嘲笑

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

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. '测试' ;

Returnarea Valorilor模仿<一种班级="hash-link" href="#returnarea-valorilor-mock" 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">轴调用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. 用户 ;
} ;

Impilearea Dublirilor模仿<一种班级="hash-link" href="#implementarea-dublurilor-mock" title="#">#

此外,还有一个案例,超出了指定返回值的能力和全面替换模拟函数的实现。这可以完成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-names" title="#">#

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

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

Validatoriperserfizaţi.<一种班级="hash-link" href="#validatori-personalizați" 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. 成为 '模拟' ;

pentru o listăpropern an a verifatorilor,verificaţi<一种href="/ro/docs/expect">DocumentAţiade参考。