2017-05-04 43 views
0

我在ES6 babel-node環境中測試。我想模擬一個在我導入的方法中使用的方法。具有挑戰性的部分似乎是我想要模擬的方法被導入到我想要測試的方法所在的文件中。我探討了proxyquire,babel-plugin-rewire,但我似乎無法讓他們在其他導入內部導入的方法上工作。從閱讀各種github問題,我覺得這可能是一個已知的限制/挫折。這是不可能的或者我錯過了什麼?如何嘲笑導入另一個導入的方法

使用proxyquire或babel-plugin-rewire時不會產生錯誤。該方法不會被嘲笑,並返回方法的正常值。

下面是導入情況的一般示例。

// 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

如果您可以修改您的測試文件,您可以使用依賴注入技術來解決您的問題。 其中一些在http://jasonpolites.github.io/tao-of-testing/ch3-1.1.html中有描述。 您可以通過將getSomething函數作爲requestSomethign的參數傳遞給例如。 –

+0

@FrankBessou是的,我意識到我可以通過它作爲一個論點。如果有必要,這並不是很糟糕,但我真的希望不必爲我的所有方法添加額外的參數。感謝您的關注和建議/鏈接。 – mpls423

+0

如果您的所有方法都需要相同的函數,您仍然可以將此函數傳遞給類構造函數。 –

回答

0

我在這裏回答我自己的問題......原來我只是不正確地使用了babel-plugin-rewire。以下是我現在如何使用它並獲得成功結果的示例。

// 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'); 
    });