跳转到主要内容
版本:25.倍

模仿德文赛ES6

jest se pueduer para simular clases de es6 que importan a los Archivos que deseas probar。

我们有六个构造函数,它们都是按序的。请注意,我们的网址是simulación,在第6条中有6条是实际的(这条,新条,另外一条是función)。这可能是相似的模拟功能

联合国Ejemero de Clase ES6#

Usaremos联合国ejealto ideado de una clase que复制了Archivos de Sonido,SoundPlayery una clase de consufidores que una esa clase,SoundPlayerConsumer.。SimularemosSoundPlayer我们有共同的心愿SoundPlayerConsumer.

// solocuctor.js.
出口 默认的 班级 复制品 {
构造函数 ( ) {
variableEjemplo = “valorEjemplo” ;
}
reproducirArchivoDeSonido ( nombreDeArchivo ) {
控制台 日志 ( 'solocuciendo Archivo de Sonido' + nombreDeArchivo ) ;
}
}
// fundidisor.js.
进口 复制品 ”。/复穿孔机 ;
出口 默认的 班级 消费者 {
构造函数 ( ) {
复穿孔机 = 新的 复制品 ( ) ;
}
reproduceAlgoCool ( ) {
常量 nombreDeArchivoCool = 'cancion.mp3' ;
复穿孔机 reproducirArchivoDeSonido ( nombreDeArchivoCool ) ;
}
}

我们有四种形式可以模仿ES6#

模仿Automáticos.#

Llamando一jest.mock(’。/留声机”)网址是simulación automática útil我们可以从métodos的网站上下载它。Reemplaza la clase Es6 con un constructor simulado, y Reemplaza todos sus métodos conFunciones deSimulación.que siempre arrojan.不明确的。Las Llamadas A LosMétodosSeAlmacenanentheautomaticmock.mock.instances [index] .methodname.mock.calls

Ten en Cuenta Que Si Utilizas Funciones de Flecha(=>)enttus clases,estasserán parte del mock。这是我们要做的事,没有están介绍了目标的原型,我们的资料是función。

如果没有必要再到implementación的广场,那就是opción más fácil, para configurar。比如:

进口 复制品 ”。/复穿孔机 ;
进口 消费者 ”。/ consumidor ' ;
笑话 嘲笑 ( ”。/复穿孔机 ) ; //复制品es es ahora联合国建设者模拟
beforeEach ( ( ) => {
// Borra Todas Las Instancias Y Llamadas Al Constructor Y TodosLosMétodos:再生乐队。
} ) ;
( 'Podemos Verificar Que El ConsumidorLlalóAl构造函数de la Clase' , ( ) => {
常量 消费者 = 新的 消费者 ( ) ;
预计 ( 复制品 ) tohavebeencalledtimes. ( 1 ) ;
} ) ;
( "我们可以验证这个人llamó a algún método de la instcia " , ( ) => {
// uestra que mockclear()estáfucionando:
预计 ( 复制品 ) TohaveBeencalled. ( ) ;
常量 消费者 = 新的 消费者 ( ) ;
//构造函数debióhowssido llamado nuevamente:
预计 ( 复制品 ) tohavebeencalledtimes. ( 1 ) ;
常量 nombreDeArchivoCool = 'cancion.mp3' ;
消费者 reproduceAlgoCool ( ) ;
// mock.instances Esta Disponible Con MocksAutomáticos:
常量 InstanciamockDereProductor. = 复制品 嘲笑 实例 ( 0 ] ;
常量 mockdereproducirarchivolsonido = InstanciamockDereProductor. reproducirArchivoDeSonido ;
预计 ( mockdereproducirarchivolsonido 嘲笑 调用 ( 0 ] ( 0 ] ) toEqual ( nombreDeArchivoCool ) ;
//相等的a la verificación前:
预计 ( mockdereproducirarchivolsonido ) Tohavebeencalledwith. ( nombreDeArchivoCool ) ;
预计 ( mockdereproducirarchivolsonido ) tohavebeencalledtimes. ( 1 ) ;
} ) ;

模拟手册#

克雷亚联合国模拟手工Almacenando UnaImportyAciónMocken La Carpeta__mocks__。Esto Te PermiteEspecificarLaimenticaAcifiamión,Y Puede Ser Uterizada ATravésde Varios Archivos De测试。

/ / __mocks__ / reproductor.js
// Importa esta exportación nombrada en tu archivo test:
出口 常量 mockdereproducirarchivolsonido = 笑话 fn ( ) ;
常量 嘲笑 = 笑话 fn ( ) 模仿 ( ( ) => {
返回 { reproducirArchivoDeSonido : mockdereproducirarchivolsonido } ;
} ) ;
出口 默认的 嘲笑 ;

Importa la simulación y el método de simulación comppartido ptodas las instcias:

// finistidor.test.js.
进口 复制品 , { mockReproducirArchivoDeSonido } ”。/复穿孔机 ;
进口 消费者 ”。/ consumidor ' ;
笑话 嘲笑 ( ”。/复穿孔机 ) ; //复制品es es ahora联合国建设者模拟
beforeEach ( ( ) => {
// Borra Todas Las Instancias Y Llamadas Al Constructor Y TodosLosMétodos:再生乐队。
mockReproducirArchivoDeSonido 笨拙 ( ) ;
} ) ;
( 'Podemos Verificar Que El ConsumidorLlalóAl构造函数de la Clase' , ( ) => {
常量 消费者 = 新的 消费者 ( ) ;
预计 ( 复制品 ) tohavebeencalledtimes. ( 1 ) ;
} ) ;
( "我们可以验证这个人llamó a algún método de la instcia " , ( ) => {
常量 消费者 = 新的 消费者 ( ) ;
常量 nombreDeArchivoCool = 'cancion.mp3' ;
消费者 reproduceAlgoCool ( ) ;
预计 ( mockdereproducirarchivolsonido ) Tohavebeencalledwith. ( nombreDeArchivoCool ) ;
} ) ;

莱纳达jest.mock()con el parámetro de fábrica de módulo#

jest.mock(ruta,fabricademodulo)Toma联合国Argumento.Fabrica de Modulo.。那是fábrica módulo那是función那是一个模拟。

Para Crear Un Mock De UnaFunción建设者,LafábricadmóduloBebeRegresar UnaFunción构造函数。en otras palabras,LaFábricademóduloQue unafunciónque trearsa unafunción - unafuncióndealtonorden,o hof,Por Su Siglas enInglés(高阶功能)。

进口 复制品 ”。/复穿孔机 ;
常量 mockReproducirArchivoDeSonido = 笑话 fn ( ) ;
笑话 嘲笑 ( ”。/复穿孔机 , ( ) => {
返回 笑话 fn ( ) 模仿 ( ( ) => {
返回 { reproducirArchivoDeSonido : mockReproducirArchivoDeSonido } ;
} ) ;
} ) ;

limitación我的论点是fábrica我的模是什么,你有一个jest.mock()儿子在档案里已经有了,不可能在fábrica中定义一个变量。我们有一个excepción变量可以用它来模拟。“看你的情况如何serán在这个时间里!”Por ejemplo, lo siguiente arrojará un error fuera de alcance(超出范围)debido al uso of 'fake' en lugar de 'mock' en declaración de la variable:

// Nota: esto fallará
进口 复制品 ”。/复穿孔机 ;
常量 fakereproducirarchivolsonido = 笑话 fn ( ) ;
笑话 嘲笑 ( / 复穿孔机 , ( ) => {
返回 笑话 fn ( ) 模仿 ( ( ) => {
返回 { reproducirArchivoDeSonido : fakereproducirarchivolsonido } ;
} ) ;
} ) ;

Sustituir el Mock UtilizandomockImplementation ()o模仿once()#

Puedes雷肯扎尔Todos Los Mocks Anteriorees Para Cambiar LaImpementAción,Para UnoAsíComoPara Todos Los Test,Al LlamarmockImplementation ()假装存在。

拉斯羊驼是个笑话。嘲笑son elevadas al principio del código. Puedes especificar una mock posteriormente, por ejemplo, enbeforeall(),电话mockImplementation ()(o.模仿once())EN El Mock存在En Lugar de Usararlámetrodefábrica。EstoTambiénLepereCamiarLaSimulaciónTenrePruebas,Si Se Necesita:

进口 复制品 ”。/复穿孔机 ;
进口 消费者 ”。/ consumidor ' ;
笑话 嘲笑 ( ”。/复穿孔机 ) ;
描述 ( 'CUANDO再生家ARRARRJA联合国错误' , ( ) => {
beforeAll ( ( ) => {
复制品 模仿 ( ( ) => {
返回 {
reproducirArchivoDeSonido : ( ) => {
新的 错误 ( '错误de prueba' ) ;
} ,
} ;
} ) ;
} ) ;
( “Debería arrojar un error al llamar a reproductive algocool” , ( ) => {
常量 消费者 = 新的 消费者 ( ) ;
预计 ( ( ) => 消费者 reproduceAlgoCool ( ) ) tothrow. ( ) ;
} ) ;
} ) ;

一个profundidad: Entendiendo las funciones构造函数模拟#

构造函数和构造函数和模拟实用程序jest.fn()。模仿()Hace Que Los Mock Se VeanMásFormadosde Lo Que en Realidad儿子。Estasección穆斯特拉Cómo贱蠕动Tus TUS Mock Para IlustrarCómoFuncionael SimularMódulos咕咕咕噜声。

Mock Manual de Otra Clase ES6#

SI定义UNA Clase ES6 Utilizando El Mismo Nombre de Archivo Que La Clase Mock En La Carpeta__mocks__, éste servirá como el mock。它的分类是será使用真实的分类。你可以到implementación领取津贴,但你不能到羊驼那里去。

Para un ejemplo ideado, la proyección podría诗así:

// __mocks __ / sound-player.js
出口 默认的 班级 SoundPlayer {
构造函数 ( ) {
控制台 日志 ( " Mock SoundPlayer:构造函数被调用" ) ;
}
playsoundfile. ( ) {
控制台 日志 ( '模拟SoundPlayer:PlaySoundFile被称为' ) ;
}
}

Mock Simple Utilitando联合国ParámetrodeFábricademódulo#

La función de fábrica de módulo pasada ajest.mock(ruta,fabricademodulo)PuedeSer UnaFuncióndaltoorden que gregresa unafunción*。EstoPermiciráLlamara新的en la simulacion。新的,在一个不同的地方有一个不同的许可证,而不是在一个更大的地方。

* LaFuncióndefábricadelMóduloBebeDevolver UnaFunción#

Para Crear Un Mock De UnaFunción建设者,LafábricadmóduloBebeRegresar UnaFunción构造函数。en otras palabras,LaFábricademóduloQue unafunciónque trearsa unafunción - unafuncióndealtonorden,o hof,Por Su Siglas enInglés(高阶功能)。

笑话 嘲笑 ( ”。/复穿孔机 , ( ) => {
返回 功能 ( ) {
返回 { reproducirArchivoDeSonido : ( ) => { } } ;
} ;
} ) ;

Nota:Las Funciones de Flecha没有Funcionaran

十美元在simulación不可以买到función不可以买羊驼新的在función de flecha在JavaScript。Así que esto no funciona:

笑话 嘲笑 ( “。/留声机” , ( ) => {
返回 ( ) => {
//不能工作;箭头函数不能用new调用
返回 { playsoundfile. : ( ) => { } } ;
} ;
} ) ;

当你arrojara_soundPlayer.default不是构造函数(Error de tipo: soundPlayer.default no es un constructor),一个menos que el código sea transpilado a ES5, por ejemplo por@babel / preset-env。(ES5没有函数类,只有serán transpiladas是一个函数简单体。)

Haciendo Seguimiento del Uso(Espiando Al Mock)#

inyectar unamideveracióndupruebaesútil,pero probablementedesearásprobar si el constructor de clase ylosmétodosestánsiendo llamados con losparámetroscrectos。

Espiando Al构造函数#

Para Rastreara allamadas Al Constructor,雷埃拉达LaFuncióndevueltapor laFuncióndealtoorden andenfuncióndemockde Jest。CréaloCon.jest.fn (),我的规格是implementaciónmockImplementation ()

进口 SoundPlayer “。/留声机” ;
笑话 嘲笑 ( “。/留声机” , ( ) => {
//工作并允许您检查构造函数调用:
返回 笑话 fn ( ) 模仿 ( ( ) => {
返回 { playsoundfile. : ( ) => { } } ;
} ) ;
} ) ;

没有permitirá inspeccionar el uso de estra clase mock, usageReproductor.mock.calls:期望(复穿孔机).toHaveBeenCalled ();o su等价cercano期待(再生or.mock.calls.length).toequal(1);

Creando模拟参数没有默认值#

如果领导班级拉这是exportación默认的módulo,这是必要的移交给联合国的反对理由cómo exportación的权利。

进口 { 复制品 } ”。/复穿孔机 ;
笑话 嘲笑 ( ”。/复穿孔机 , ( ) => {
// Funciona Y Te Permite Verificar Llamadas Al Constructor:
返回 {
复制品 : 笑话 fn ( ) 模仿 ( ( ) => {
返回 { reproducirArchivoDeSonido : ( ) => { } } ;
} ) ,
} ;
} ) ;

埃斯皮亚多métodos de nuestra clase#

Nuestra Clase SimuladaNecesitaráProporcionarCualquierFunciónMiembro(playsoundfile.当我说)será美洲驼,你会发现一个错误,你会发现你的错误función,但你不存在。我们很可能会有大羊驼,网址是métodos,我们会有大羊驼,网址是parámetros。

联合国新反对será creado cada vez que simulación de la función constructora sea llamada durante las pruebas。我们的羊驼从método到我们的目标,波布拉莫斯playsoundfile.Con OtraFuncióndeimulación,y Almacenamos Una Referencia para esa mismafuncióndeimulaciónnennuestro Archivo de Prueba,Para QueEstéImperanibleDutanteLas Pruebas。

进口 SoundPlayer “。/留声机” ;
常量 mockPlaySoundFile = 笑话 fn ( ) ;
笑话 嘲笑 ( “。/留声机” , ( ) => {
返回 笑话 fn ( ) 模仿 ( ( ) => {
返回 { playsoundfile. : mockPlaySoundFile } ;
//现在我们可以跟踪playSoundFile的调用
} ) ;
} ) ;

simulación的等效手册sería:

// __mocks __ / sound-player.js
//将此命名导出导入测试文件
出口 常量 mockPlaySoundFile = 笑话 fn ( ) ;
常量 嘲笑 = 笑话 fn ( ) 模仿 ( ( ) => {
返回 { playsoundfile. : mockPlaySoundFile } ;
} ) ;
出口 默认的 嘲笑 ;

El USO ES类似A LaFuncióndefábricadelMódulo,SóloQue Puede Omitir El Segundo Argumento dejest.mock(), y deberá importar el método simulado a su archiva de prueba,你不能确定ahí。使用módulo的表格;没有incluya__mocks__

Limpiando之间功能#

对羊驼进行登记función模拟建筑métodos,羊驼amockClear ()en lafunción.beforeEach ():

beforeEach ( ( ) => {
SoundPlayer 笨拙 ( ) ;
mockPlaySoundFile 笨拙 ( ) ;
} ) ;

ejetrepo合成#

Aquítiene联合国Archivo de prueba properno el culeriza联合国Parámetrodefábricademódulosparajest.mock.:

/ / sound-player-consumer.test.js
进口 SoundPlayer “。/留声机” ;
进口 SoundPlayerConsumer. ”。/ sound-player-consumer ' ;
常量 mockPlaySoundFile = 笑话 fn ( ) ;
笑话 嘲笑 ( “。/留声机” , ( ) => {
返回 笑话 fn ( ) 模仿 ( ( ) => {
返回 { playsoundfile. : mockPlaySoundFile } ;
} ) ;
} ) ;
beforeEach ( ( ) => {
SoundPlayer 笨拙 ( ) ;
mockPlaySoundFile 笨拙 ( ) ;
} ) ;
( “消费者应该能够在SoundPlayer上调用新() , ( ) => {
常量 SoundPlayerConsumer. = 新的 SoundPlayerConsumer. ( ) ;
//确保构造函数创建了对象:
预计 ( SoundPlayerConsumer. ) toBeTruthy ( ) ;
} ) ;
( “我们可以检查消费者是否称为类构造函数' , ( ) => {
常量 SoundPlayerConsumer. = 新的 SoundPlayerConsumer. ( ) ;
预计 ( SoundPlayer ) tohavebeencalledtimes. ( 1 ) ;
} ) ;
( “我们可以检查Class实例上的消费者是否称为方法' , ( ) => {
常量 SoundPlayerConsumer. = 新的 SoundPlayerConsumer. ( ) ;
常量 coolsoundfilename. = “song.mp3” ;
SoundPlayerConsumer. Playsometingcool. ( ) ;
预计 ( mockPlaySoundFile 嘲笑 调用 ( 0 ] ( 0 ] ) toEqual ( coolsoundfilename. ) ;
} ) ;