2016-07-05 15 views
0

ich einen sehr einfachen Unit-Test habe, die wie folgt aussieht:Mocking Methoden in Jest

import ApiWrapper from '../../services/api_wrapper'; 
jest.unmock('../helper') 

describe('Helper',() => { 
    let Helper; 

    beforeEach(() => { 
     Helper = require('../helper').default; 
    }); 

    it('calls the Api Wrapper',() => { 
     Helper.help() 

     expect(ApiWrapper.help).toHaveBeenCalled(); 
    }); 

}); 

Wo Helper sieht wie folgt aus:

import ApiWrapper from '../services/api_wrapper' 
class Helper { 
    help() { 
     ApiWrapper.help() 
    } 
} 

export default new Helper(); 

Und ApiWrapper sieht wie folgt aus:

class ApiWrapper { 
    static help() { 
    console.log('help!') 
    } 
} 
export default ApiWrapper; 

ApiWrapper.help() wird von Jest verspottet, also 'Hilfe!' wird nie gedruckt, aber die Erwartung im Test schlägt fehl. Dies scheitert nach wie vor, wenn wir ApiWrapper umschreiben nur ein einfaches Javascript-Objekt wie so sein:

export default { 
    help:() => { console.log('help!'); } 
} 

Es funktioniert aber, wenn wir die Importe in der Spezifikation zu ändern (so wird ApiWrapper in der before importiert), und schreiben ApiWrapper

class ApiWrapper { 
    help() { 
     console.log('help!'); 
    } 
}(); 

export default new ApiWrapper(); 

Was ist es über Jest spöttisches Verhalten, das dies ermöglicht: eine Singleton-Klasse, wie so zu sein?

+1

Einige weitere Informationen im Thread, woher diese Frage: https://github.com/facebook/jest/issues/1245 – eebbesen

Antwort

0

Funktioniert es, wenn Sie die require('../helper').default; außerhalb der beforeEach() verschieben?

Sie müssen es nicht vor jedem Test initialisieren. Allerdings würde ich ApiWrapper.help.mockClear() in beforeEach() setzen, um Scheinaufrufe zurückzusetzen.