2017-09-22 1 views
2

J'ai une action Redux, qui elle-même distribue deux autres actions. Chaque action est extraite d'une fonction importée. Un d'un module local, l'autre d'une bibliothèque externe.Impossible de remplacer une fonction à l'aide de Sinon

import { functionA } from './moduleA'; 
import { functionB } from 'libraryB'; 

export function myAction() { 
    return (dispatch) => { 
    dispatch(functionA()); 
    ... 
    dispatch(functionB()); 
    } 
} 

Dans mes tests, je suis en utilisant un bac à sable sinon pour bouchonner les fonctions mais seulement deux des tests passent. Je m'attends à ce que tous les 3 passent.

import * as A from './moduleA'; 
import * as B from 'libraryB'; 

describe(__filename, async() => { 
    it('Calls 2 other actions',() => { 
    sandbox = sinon.sandbox.create(); 

    const dispatch = sandbox.stub(); 

    sandbox.stub(A, 'functionA'); 
    sandbox.stub(B, 'functionB'); 

    await myAction()(dispatch); 

    // passes 
    expect(dispatch.callCount).to.equal(2); 

    //passes 
    expect(A.functionA).to.have.been.called(); 

    // fails 
    expect(B.functionB).to.have.been.called();  
    }); 
}); 

La dernière attendre échoue avec l'erreur:

TypeError: [Function: functionB] is not a spy or a call to a spy!

Quand je sortie les fonctions de la console je reçois ce qui semble être lié à la façon dont Babel importe une exportation exportée (ES6 re-exported values are wrapped into Getter). Les fonctions fonctionnent en direct, mais pas dans le test.

{ functionA: [Function: functionA] } 
{ functionB: [Getter] } 

J'ai essayé d'utiliser stub.get(getterFn) mais me donne l'erreur:

TypeError: Cannot redefine property: fetchTopicAnnotations

Répondre

0

Avez-vous essayé de nommer vos talons? Votre code lit un peu bizarre. Vous ne faites référence à vos talons à aucun moment de votre test.

import * as A from './moduleA'; 
import * as B from 'libraryB'; 

describe(__filename, async() => { 
    it('Calls 2 other actions',() => { 
    sandbox = sinon.sandbox.create(); 

    const dispatch = sandbox.stub(); 

    const functionAStub = sandbox.stub(A, 'functionA'); 
    const functionBStub = sandbox.stub(B, 'functionB'); 

    await myAction()(dispatch); 

    // passes 
    expect(dispatch.callCount).to.equal(2); 

    //passes 
    expect(functionAStub.called).toBe(true); 

    // fails 
    expect(functionBStub.called).toBe(true);  
    }); 
}); 
+0

Merci pour votre réponse, mais nommer les talons n'a aucun effet –