2015-11-23 19 views
5

qualcuno ha scritto test di gelsomino/scherzo usando la sintassi es2015? quanto shimming/polyfill/gerrymandering richiede?babel-jest ES2015 import statement

sto riscontrando problemi nell'importazione delle funzioni correttamente. Ho un modulo:. .../utils/TweetUtils.js

'use strict'; 

export function getListOfTweetIds (tweets) { 
    return Object.keys(tweets); 
}; 

e un test privato:

... ./__ test __/TweetUtils-test.js

'use strict'; 
jest.dontMock('../TweetUtils'); 
import * as TweetUtils from '../TweetUtils'; 

describe('Tweet utilities module',() => { 

    it('has access to the TweetUtils methods',() => { 

    let testObj = {a:'a',b:'b',c:'c'}; 
    // Passes 
    expect(TweetUtils.getListOfTweetIds).toBeDefined(); 
    // Passes 
    expect(typeof TweetUtils.getListOfTweetIds).toBe('function'); 
    // Fails 
    expect(TweetUtils.getListOfTweetIds(testObj)).toBeTruthy(); 
    }); 
}); 

Se si modifica l'output di una console nella suite con qualcosa del genere: expect(‘’).toBe(TweetUtils);

Jasmine riporta questo:

- Expected: '' toBe: { 
     default: { 
      getListOfTweetIds: Function 
     }, 
     getListOfTweetIds: Function 
    } 

Così sembra che l'istruzione import sta facendo qualcosa, ma non è chiaramente l'importazione miei metodi onestamente. Ottengo gli stessi risultati quando ho importare utilizzando la sintassi della funzione denominata: import {getListOfTweetIds} from ‘../TweetUtils’; Ma se io uso la sintassi predefinita: import getListOfTweetIds from ‘../TweetUtils’; Il secondo spec fallisce - non è più typeof function è, ma typeof object // => {default: Function}

mi è stato pettinando i documenti e questioni aperte. Ci sono stati problemi correlati per alcuni mesi, ma i problemi noti non sembrano giusti. Ho provato a importare le mie istruzioni jest.dontMock per evitare il sollevamento, circa: https://github.com/babel/babel-jest/issues/16 ma senza dadi.

Tutto funziona se modifico TweetUtils.js da utilizzare module.exports = function… e portarlo nella suite con const myFunction = require(‘../TweetUtils’), ma non si sente come sto canalizzare la vera magia ES2015. Ognuno di noi ha appena a che fare con un lavoro approssimativo mentre l'ecosistema raggiunge la nuova sintassi?

risposta

4

Come hai detto, import dichiarazioni vengono issate e causa problemi con la funzione di auto-beffardo scherzo (il modulo viene importato prima di dire per scherzo a unmocked esso).

TweetUtils.getListOfTweetIds è importato correttamente ma è preso in giro, quindi ogni chiamata restituisce undefined. Ecco perché la terza aspettativa fallisce.

Importazione jest.dontMock dichiarazione potrebbe funzionare (ho provato) ma suona sporco a me (Sei sicuro di voler creare un file "Modulo dontmock" per ogni moduli di test?)

Devi usare la sintassi require per il modulo testato. Sostituire

import * as TweetUtils from '../TweetUtils'; 

da

const TweetUtils = require('../TweetUtils'); 

E 'stato lo stesso in esempio per scherzo, prima ho riparato: jest#379

+0

Nel mio caso questo ha funzionato solo quando ho aggiunto .default: 'TweetUtils const = richiedono (' ../ TweetUtils') di default; '. – vitalets