2016-11-23 11 views
11

Próbuję wyśmiać wywołanie funkcji i oczekiwać, że raz wywołał inną funkcję w nim.Jest - kpiny z wywołania funkcji

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

Jednak wyjście żartem mówi, że nie został powołany. Jeśli ktoś może zasugerować, jak najlepiej to zrobić, byłbym bardzo wdzięczny.

Odpowiedz

16

Twoja dawka docelowa nie działa, ponieważ kpisz clearSomethingInModal tylko w kontekście pliku testowego, więc clearSomethingInModal w myFunction.js jest nadal oryginalna. Najważniejsze jest to, że nie możesz wyśmiać czegoś, co jest bezpośrednio stworzone w myFunction.js. Jedyne, co można drwić są

  1. modułów, które importować do myFunction.js, jak import clearSomethingInModal from 'clearSomethingInModal'
  2. wywołania zwrotne, które przechodzą do swojej funkcji podczas wywoływania ich z testu

Ma to sens, jeśli ciebie pomyśl o myFunction.js jako blackbox, gdzie możesz kontrolować, co się dzieje, jak import lub argumenty funkcji, i gdzie możesz sprawdzić, co wychodzi. Ale nie możesz testować rzeczy, które dzieją się wewnątrz pudełka.

Oto dwa przykładem, który odzwierciedla 2 punkty na liście

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

Dzięki Andreas, że to świetny wyjaśnienie. Więc rozumiem, że bez zmiany struktury mojej funkcji, nie mogę testować w sposób jaki chcę. Czyli (a) oznaczałoby to problem przy projektowaniu funkcji, oraz (b), w jej obecnej formie, czy byłyby jakieś ważne testy, które można by do niego zastosować? Zauważ, że funkcja "resetModal" również wywołuje wiele innych funkcji, które zostały pominięte dla zwięzłości –