2017-05-04 88 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'); 
    });