2016-11-23 2 views
11

Ich versuche, einen Funktionsaufruf zu verspotten, und erwarte, dass er einmal eine andere Funktion aufgerufen hat.Jest - einen Funktionsaufruf spotten

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() 
} 

jedoch Ausgang Jest sagt, dass es nicht aufgerufen wurde. Wenn jemand vorschlagen kann, wie das am besten geht, wäre ich sehr dankbar.

Antwort

16

Ihr Ansatz Dosis funktioniert nicht, weil Sie clearSomethingInModal nur im Zusammenhang mit Ihrer Testdatei Mock, also clearSomethingInModal in der myFunction.js ist immer noch das Original. Der Hauptpunkt ist, dass Sie nicht etwas verspotten können, das direkt in myFunction.js erstellt wird. Das einzige, was Sie verspotten sind

  1. Module, die Sie myFunction.js importieren, wie import clearSomethingInModal from 'clearSomethingInModal'
  2. Rückrufe, die Sie in Ihrer Funktion übergeben, wenn sie von Ihrem Test

Dies macht Sinn, wenn Sie anrufen Denken Sie an myFunction.js als eine Blackbox, wo Sie steuern können, was reingeht, wie Importe oder Funktionsargumente, und wo Sie testen können, was herauskommt. Aber du kannst das Zeug nicht testen, das in der Box passiert.

Hier sind zwei Beispiele, dass die zwei Punkte in der Liste

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 reflektieren

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

Dank Andreas, das ist eine große Erklärung. Ich nehme also an, ohne die Struktur meiner Funktion zu verändern, kann ich nicht so testen, wie ich es möchte. Also, (a) würde dies ein Problem bei der Gestaltung der Funktion bedeuten, und (b) würde es in seiner derzeitigen Form gültige Tests geben, die Sie anwenden könnten? Beachten Sie, dass die 'resetModal'-Funktion auch eine Reihe anderer Funktionen in ihr aufruft, die ich der Kürze halber weggelassen habe –

Verwandte Themen