2016-11-23 97 views
11

我试图嘲笑一个函数调用,并期望它在其中调用过一次函数。Jest - 嘲弄函数调用

myFunctions.test.js

import { resetModal } from '../myFunctions.js'; 

describe('resetModal',() => { 
    it('calls the clearSomethingInModal function',() => { 
    const clearSomethingInModal = jest.fn(); 
    resetCreationModal(); 
    expect(clearSomethingInModal.mock.calls.length).toBe(1); 
    }) 
}) 

myFunctions.js

export resetModal() { 
    clearSomethingInModal() 
} 

然而,玩笑输出表示,它没有被调用。如果有人可以建议如何做到这一点,我将非常感激。

回答

16

由于您仅在测试文件的上下文中模拟clearSomethingInModal,因此中的clearSomethingInModal仍为原始文件,因此您的方法无效。重点是你不能嘲笑在myFunction.js中直接创建的东西。你可以嘲笑的唯一的事情是,你导入到myFunction.js从您的测试时调用它们传递给你的函数

  1. 模块,例如import clearSomethingInModal from 'clearSomethingInModal'
  2. 回调

这是有道理的,如果你把myFunction.js想象成一个黑盒子,你可以控制进入的东西,比如导入或者函数参数,以及你可以在哪里测试出来的东西。但是你无法测试盒子内发生的事情。

下面是两个例子,在列表中反映2分

myFunctions.test.js

import { resetModal } from '../myFunctions.js'; 
import clearSomethingInModal from 'clearSomethingInModal'; 

jest.mock('clearSomethingInModal',() => jest.fn()) 

describe('resetModal',() => { 
    it('calls the clearSomethingInModal function',() => { 
    resetCreationModal(); 
    expect(clearSomethingInModal.mock.calls.length).toBe(1); 
    }) 
}) 

myFunctions.js

import clearSomethingInModal from 'clearSomethingInModal'; 

export resetModal() { 
    clearSomethingInModal() 
} 

myFunctions.test.js

import { resetModal } from '../myFunctions.js'; 

describe('resetModal',() => { 
    it('calls the clearSomethingInModal function',() => { 
    const clearSomethingInModal = jest.fn(); 
    resetCreationModal(clearSomethingInModal); 
    expect(clearSomethingInModal.mock.calls.length).toBe(1); 
    }) 
}) 

myFunctions.js

export resetModal(clearSomethingInModal) { 
    clearSomethingInModal() 
} 
+1

谢谢安德烈亚斯,这是一个很好的解释。所以我认为,不改变我的功能的结构,我不能以我想要的方式测试。因此,(a)是否意味着在功能设计中存在问题,以及(b)在目前的形式下,是否会有适用于该功能的有效测试?请注意,'resetModal'函数还会调用其中的一些其他函数,为简洁起见我省略了这些函数 –