2017-08-05 4 views
1

Ich versuche jest zu verwenden, um Anrufe zu firebase zu testen. Firebase ist ein Online-Datenbankdienst von Google. Ich spöttisch das firebase Modul wie untenJest Test beendet, bevor die mokierte Firebase-Funktion aufgerufen wird und daher fehlschlägt

'use strict'; 

const firebase = jest.genMockFromModule('firebase'); 

const ref = jest.fn(() => { 
    return { 
    child: jest.fn(() => { 
     return ref 
    }), 
    update: jest.fn(() => { 
     console.log('Called update') 
     return Promise.resolve() 
    }) 
    } 
}) 

firebase.initializeApp = jest.fn() 
firebase.database = jest.fn(() => { 
    return { 
    ref: ref 
    } 
}) 

module.exports = firebase 

Ich bin nur die Funktionen spöttisch, die ich im Moment testen müssen. Unten ist mein Testfall.

it('+++ actionCreator addAlarm',() => { 
    const store = mockStore(initialState) 
    store.dispatch(ActionCreators.addAlarm(alarm)); 
    // Make sure that the scheduleNotifications API is called 
    expect(scheduleNotifications).toHaveBeenCalled(); 
    expect(firebase.initializeApp).toHaveBeenCalled(); 
    expect(firebase.database().ref().update).toHaveBeenCalled(); 
}); 

Die letzte Zeile im Testfall versucht, um sicherzustellen, dass ich die firebaseupdate Funktion nenne, die verspottet wird.

Im Folgenden finden Sie die Konsolenausgabe

abcs-MBP-2:GalarmApp abc$ npm test 

> [email protected] test /Users/abc/Projects/GalarmApp 
> jest 

FAIL __tests__/actionsSpecs.js 
    ● >>>A C T I O N --- Test galarm actions: › +++ actionCreator addAlarm 

    expect(jest.fn()).toHaveBeenCalled() 

    Expected mock function to have been called. 

     at Object.<anonymous> (__tests__/actionsSpecs.js:58:52) 
     at tryCallTwo (node_modules/promise/lib/core.js:45:5) 
     at doResolve (node_modules/promise/lib/core.js:200:13) 
     at new Promise (node_modules/promise/lib/core.js:66:3) 
     at Promise.resolve.then.el (node_modules/p-map/index.js:42:16) 
     at tryCallOne (node_modules/promise/lib/core.js:37:12) 
     at node_modules/promise/lib/core.js:123:15 

    >>>A C T I O N --- Test galarm actions: 
    ✕ +++ actionCreator addAlarm (8ms) 
    ✓ +++ actionCreator setConnectionStatus (4ms) 

Test Suites: 1 failed, 1 total 
Tests:  1 failed, 1 passed, 2 total 
Snapshots: 1 passed, 1 total 
Time:  1.989s, estimated 2s 
Ran all test suites. 
    console.warn node_modules/rn-host-detect/index.js:45 
    [SECURITY] node-uuid: crypto not usable, falling back to insecure Math.random() 

    console.log __mocks__/firebase.js:11 
    Called update 

Der Testfall ist auf der Linie versagt, wo ich überprüfen, ob die update Funktion aufgerufen wird. Wenn Sie in der Konsolenausgabe nach unten schauen, werden Sie sehen, dass die Called update Konsole vorhanden ist, was bedeutet, dass die Update-Funktion aufgerufen wird, aber sie wird aufgerufen, nachdem der Testfall fehlgeschlagen ist.

Dies ist die addAlarm Aktion, die eine Aktion Thunk ist

const addAlarm = (alarm) => (dispatch, getState) => { 
    if(alarm.status) { 
    NotificationManager.scheduleNotifications(alarm); 
    } 

    const alarmObjForFirebase = this.createAlarmObjForFirebase(alarm) 
    firebaseRef.update(alarmObjForFirebase) 
} 

Der Aufruf von firebaseupdate Funktion nicht asynchron so weit geschieht wie ich sie verstehe.

Bitte lassen Sie mich wissen, wenn Sie Hinweise haben, wie ich dieses Problem beheben kann.

Antwort

1

Ich habe das Problem in meinem Code und Posting als eine Lösung für andere profitieren gefunden. Das Problem ist die Art und Weise, wie der update Schein definiert wurde. Die Art und Weise, wie es definiert wurde, bekam ich eine neue Instanz der update Scheinfunktion jedes Mal, wenn ich einen Anruf an die firebase.database().ref().update. Since this is a new instance of the mock function, it wouldn't contain any data about Funktion machen werde, die in der Vergangenheit aufgerufen wurde.

Ich brauchte den Code zu ändern, wie

const update = jest.fn(() => { 
    return Promise.resolve() 
}) 

const ref = jest.fn(() => { 
    return { 
    update: update 
    } 
}) 

Auf diese Weise folgt, habe ich keine neue Instanzen der update Mock-Funktion, und ich war in der Lage zu behaupten, erschaffe, dass es während des Testfalls genannt wurde.

Verwandte Themen