跳转到主要内容
版本:下一步

模仿德文赛ES6

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

ES6子函数的构造函数是在线性条件下的。在这里,cualquier simulación para para ES6是ES6类实际的函数(这是新的,其他的则是función)。我们可以用类似的usando模拟功能

联合国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 ) ;
}
}

第四种形式的crear una类模拟ES6#

模仿Automáticos.#

Llamando一jest.mock(’。/留声机”)阿罗哈“simulación automática”útil该公司为骆驼建造的工厂为SUS métodos。在Es6级构造器的模拟中,我们要做的是métodosFunciones 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。

Si no Necesitas reementazarlaimenticaióndaClase,Esta EslaOpciónMásFácilAlaIngionUrar。Por Ejetrevo:

进口 复制品 ”。/复穿孔机 ;
进口 消费者 ”。/ 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 instancia , ( ) => {
// 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 nobrada en tu archive test:
出口 常量 mockdereproducirarchivolsonido = 笑话 fn ( ) ;
常量 嘲笑 = 笑话 fn ( ) 模仿 ( ( ) => {
返回 { reproducirArchivoDeSonido : mockdereproducirarchivolsonido } ;
} ) ;
出口 默认的 嘲笑 ;

Importa la simulación y el método de simulación compartido por todas las instance:

// 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 instancia , ( ) => {
常量 消费者 = 新的 消费者 ( ) ;
常量 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,它是一个mock。

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 para variables empiecen con la palabra 'mock'。取决于你的地址serán初始化izadas a tiempo!Por ejemplo, lo siguiente arrojará un error fuera de alcance(超出范围)debido al uso de 'fake' en lugar de 'mock' en la 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 replealgocool ' , ( ) => {
常量 消费者 = 新的 消费者 ( ) ;
预计 ( ( ) => 消费者 reproduceAlgoCool ( ) ) tothrow. ( ) ;
} ) ;
} ) ;

构造函数的模仿#

构造函数是模拟效用的构造函数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。Esta class será utilzada en lugar de la clasase real。为使我们的产品符合标准implementación,在美洲驼的外形上是不相称的。

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

// __mocks __ / sound-player.js
出口 默认的 SoundPlayer {
构造函数 ( ) {
控制台 日志 ( 'Mock SoundPlayer: constructor was called' ) ;
}
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不可以给他发邮件新的en una función de fleecha en JavaScript。Así没有作用:

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

当你arrojaraTypeError: _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来代替一个简单函数。)

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 (), y luego specia su implementación conmockImplementation ()

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

为permitirá对新类别的观察,效用Reproductor.mock.calls:期望(复穿孔机).toHaveBeenCalled ();O苏相当于cercano期待(再生or.mock.calls.length).toequal(1);

Creando模仿para导出没有默认值#

如果领导班级拉例如exportación default del módulo,需要向联合国提交对联合国对羊驼的反对意见cómo exportación de la class。

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

Espiando métodos de nuestra class#

Nuestra Clase SimuladaNecesitaráProporcionarCualquierFunciónMiembro(playsoundfile.在这里,我们说será羊驼是不存在的,那么我们就说función羊驼是不存在的。我很可能要去买一只羊驼métodos,在羊驼和parámetros esperados的关系中,我要去买一只。

一个新项目será为simulación de la función建造的海羊驼在普鲁巴斯。请注意método的羊驼,poblamosplaysoundfile.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 manual de esto 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(),是deberá进口método模拟的文件,它是不确定的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 ) ;
} ) ;
( '我们可以检查消费者是否调用了类实例上的方法' , ( ) => {
常量 SoundPlayerConsumer. = 新的 SoundPlayerConsumer. ( ) ;
常量 coolsoundfilename. = “song.mp3” ;
SoundPlayerConsumer. Playsometingcool. ( ) ;
预计 ( mockPlaySoundFile 嘲笑 调用 ( 0 ] ( 0 ] ) toEqual ( coolsoundfilename. ) ;
} ) ;