2017-05-04 2 views
0

Ich teste in einer ES6 Babel-Knoten-Umgebung. Ich möchte eine Methode vortäuschen, die innerhalb der Methode verwendet wird, die ich importiere. Der herausfordernde Teil scheint zu sein, dass die Methode, die ich nachahmen möchte, in die Datei importiert wird, in der sich die Methode befindet, die ich testen möchte. Ich habe proxyquire, babel-plugin-rewire untersucht, aber ich kann sie nicht dazu bringen, an Methoden zu arbeiten, die bei anderen Importen importiert werden. Beim Lesen verschiedener GitHub-Probleme habe ich das Gefühl, dass dies eine bekannte Einschränkung/Frustration sein könnte. Ist das nicht möglich oder fehlt mir etwas?Wie man eine Methode vortäuscht, die innerhalb eines anderen Importes importiert wird

Bei der Verwendung von proxyquire oder babel-plugin-rewire werden keine Fehler erzeugt. Die Methode wird nur nicht gemunkelt und gibt den normalen Wert der Methode zurück.

Hier ist ein generisches Beispiel der Importsituation.

// serviceLayer.js 

getSomething(){ 
    return 'something'; 
} 


// actionCreator.js 

import { getSomething } from './serviceLayer.js'; 

requestSomething(){ 
    return getSomething(); <------- This is what I want to mock 
} 


// actionCreator.test.js 

import test from 'tape'; 
import {requestSomething} from 'actionCreator.js' 

test('should return the mock' , (t) => { 
    t.equal(requestSomething(), 'something else'); 
}); 
+0

Wenn Sie Ihre getestete Datei ändern können, können Sie die Abhängigkeitsinjektionstechniken verwenden, um Ihr Problem zu lösen. Einige von ihnen sind in http://jasonpolites.github.io/tao-of-testing/ch3-1.1.html beschrieben. Sie können dies tun, indem Sie die Funktion getSomething als Argument von requestSomethign übergeben. –

+0

@FrankBessou Ja, ich weiß, ich könnte es als Argument übergeben. Es wäre nicht schrecklich, wenn das nötig wäre, aber ich hatte wirklich gehofft, dass ich nicht all meine Methoden mit zusätzlichen Argumenten ergänzen musste. Danke für die Suche und den Vorschlag/Link. – mpls423

+0

Wenn alle Ihre Methoden dieselbe Funktion benötigen, können Sie diese Funktion dennoch an den Klassenkonstruktor übergeben. –

Antwort

0

Ich beantworte meine eigene Frage hier ... Stellt sich heraus, dass ich nur babel-plugin-rewire falsch verwendet habe. Hier ist ein Beispiel, wie ich es jetzt mit erfolgreichen Ergebnissen verwende.

// serviceLayer.js 

    export const getSomething =() => { 
    return 'something'; 
    } 


    // actionCreator.js 

    import { getSomething } from './serviceLayer.js'; 

    export const requestSomething =() => { 
    return getSomething(); <------- This is what I want to mock 
    } 


    // actionCreator.test.js 

    import test from 'tape'; 
    import { requestSomething, __RewireApi__ } from 'actionCreator.js' 
    __RewireApi__.Rewire('getSomething' ,() => { 
    return 'something else'' 
    }); 

    test('should return the mock' , (t) => { 
    t.equal(requestSomething(), 'something else'); 
    }); 
Verwandte Themen