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

手动模拟

las simulaciones模拟手册儿子USADAS Para Sustituir Funcionionidad Con Datos Falsos。Por Ejeallo,EN Lugar De Acceder A联合国Refurso Remoto Como联合国Sitio Web O UNA Base De Datos,Puede Que Seeeeeeee Crear UnaSimulaciónManualQue Permita Usar Datos Falsos。Esto Asegura que las pruebasseránrápidasy建立。

嘲笑用户模块

LAS Simulaciones Mock Manages Se Imereen Escribiendo UN Modulo En El Subdirectorio__mocks__El Cual SE Debe Encontrar Adyactee AlMódulo。Por Ejethro,Para Simular联合国MóduloLaLlamado用户en El Deversio.楷模,Se debe crear联合国Archivouser.sj.y Colocarse en El Deverio模型/ __模仿__。请注意__mocks__文件夹区分大小写,所以命名目录__mocks__将突破一些系统。

当我们在测试中要求该模块时,明确地呼叫jest.mock('./ modulename')必需的

嘲笑节点模块

如果您嘲笑的模块是节点模块(例如:洛奇),嘲笑应该放在__mocks__邻近的目录node_modules.(除非您配置了指向项目根目录以外的文件夹),将是自动地嘲笑。没有必要明确地打电话jest.mock('module_name')

范围模块(也称为范围包装)可以通过在与范围名称的目录结构中创建文件来嘲笑。例如,要模拟一个调用的范围模块@范围/项目名称,创建文件__mocks__/@scope/project-name.js.,创造@范围/相应的目录。

警告:如果我们想要模拟节点的核心模块(例如:FS.或者小路),然后明确地称呼例如jest.mock('path')必需的,因为默认情况下核心节点模块未映射。

ejegros.

├──配置
├──__mocks__
│└──fs.js.
├──模特
│├──__mocks__
││└──user.js
│└──user.js.
├──node_modules.
└──观点

Cuando UnaSimulaciónMock手册存在ParaUnmódulo,El SistemadeMódulosde JestUsaráDichoMock Cuando Se Llame A LaFunciónjest.mock('nombremodulo')。但是,当汽车设定为真的,手动模拟实现将被使用而不是自动创建的模拟,即使jest.mock('modulename')不被称为。Para Omitir Este Comportamiento,Se Debe Llamar de Manera Explicita A.Jest.umock('Nombremodulo')en pruebas donde se desee Usar LaImpeedAciónreal delmódulo。

注意:为了嘲笑,需求jest.mock('modulename')与之相同的范围要求/导入陈述。

这是一个创意的例子,我们有一个模块,它提供给定目录中的所有文件的摘要。在这种情况下,我们使用核心(内置)FS.模块。

// filesummarizer.js.
'使用strict' ;
const FS. = 要求 'fs' ;
功能 summarizefilesindirectorysync. 目录 {
返回 FS. readdirsync. 目录 地图 文件名 => {
目录
文件名
} ;
}
出口 summarizefilesindirectorysync. = summarizefilesindirectorysync. ;

由于我们希望尝试避免实际击中磁盘(这非常缓慢而脆弱),我们为此创建了手动模拟FS.模块通过扩展自动模拟。我们的手动模拟将实现自定义版本FS.我们可以为我们的测试建立的API:

// __mocks __ / fs.js
'使用strict' ;
const 小路 = 要求 '小路' ;
const FS. = 笑话 createmockfrommodule. 'fs' ;
//这是一个自定义功能,我们的测试可以在安装期间使用以指定
//“模拟”文件系统上的文件应该看起来像什么时候
//使用`fs` apis。
模仿 = 目的 创造 空值 ;
功能 __setmockfiles. newmockfiles. {
模仿 = 目的 创造 空值 ;
为了 const 文件 newmockfiles. {
const 谜语 = 小路 妄想 文件 ;
如果 !! 模仿 [ 谜语 ] {
模仿 [ 谜语 ] = [ ] ;
}
模仿 [ 谜语 ] 小路 Basename. 文件 ;
}
}
//从特殊模型中读取的“readdirsync`的自定义版本”
//通过__setmockfiles设置文件列表
功能 readdirsync. 目录路径 {
返回 模仿 [ 目录路径 ] || [ ] ;
}
FS. __setmockfiles. = __setmockfiles. ;
FS. readdirsync. = readdirsync. ;
模块 出口 = FS. ;

现在我们写了我们的测试。请注意,我们需要明确地告诉我们想要嘲笑FS.模块是因为它是一个核心节点模块:

// __tests __ / filesummarizer-test.js
'使用strict' ;
笑话 嘲笑 'fs' ;
描述 'listfilesindirectorysync' => {
const mock_file_info. = {
'/path/to/file1.js' 'console.log(“file1内容”);'
'/path/to/file2.txt' 'file2内容'
} ;
摘要 => {
//在每次测试之前设置一些模型的文件信息
要求 'fs' __setmockfiles. mock_file_info. ;
} ;
测试 '包括摘要中目录中的所有文件' => {
const filesumarizer = 要求 '../filesummarizer' ;
const 文件ummary. = filesumarizer summarizefilesindirectorysync.
'/ path /'
;
预计 文件ummary. 长度 成为 2 ;
} ;
} ;

这里显示的示例模拟使用jest.createmockfrommodule.要生成自动模拟,并覆盖其默认行为。这是推荐的方法,但完全可选。如果您不想ally使用自动模拟,则可以从模拟文件导出自己的函数。完全手动模拟的一个缺点是它们是手动 - 这意味着您必须在它们嘲笑更改的模块时手动更新它们。因此,它最好使用或延长自动模拟时,它适用于您的需求。

为确保手动模拟及其实际实现保持同步,可能需要使用实体模块Jest.requireAcctual(Modulename)在您的手动模拟中,在导出之前用模拟函数修改它。

此示例的代码可用示例/手动模拟

usando con进口demódulos

如果你使用了ES模块导入那么你通常会倾向于把你的进口测试文件顶部的语句。但是,通常需要指示Jest在模块使用之前使用模拟。因此,Jest将自动提升jest.mock.调用模块顶部(在任何导入之前)。要了解更多有关此功能,请参阅这个回购

嘲弄方法在JSDOM中未实施

如果某些代码使用jsdom(Jest使用的DOM实现)的方法尚未实现,则无法轻易测试。这是如此。这种情况window.matchmedia()。jest回报typeerror:window.matchmedia不是函数并且没有正确执行测试。

在这种情况下,嘲笑匹配媒体在测试文件中应该解决问题:

目的 defineproperty. 窗户 'matchmedia' {
可写的 真的
价值 笑话 FN. 模仿 询问 => {
火柴 错误的
媒体 询问
onchange. 空值
addListener. 笑话 FN. //弃用
removelistener. 笑话 FN. //弃用
addeventlistener. 笑话 FN.
RemoveeventListener. 笑话 FN.
DispatchEvent. 笑话 FN.
}
} ;

这是适用的window.matchmedia()用于在测试中调用的函数(或方法)。如果window.matchmedia()直接在测试文件中执行,Jest报告相同的错误。在这种情况下,解决方案是将手动模拟移动到单独的文件中,并在测试中包含此一个测试文件:

进口 './matchmedia.mock' ; //必须在测试文件之前导入
进口 { 迈运 } './file-to-test' ;
描述 'mymethod()' => {
//测试该方法...
} ;