2016-11-23 98 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'函數還會調用其中的一些其他函數,爲簡潔起見我省略了這些函數 –