javascript模拟导入组件与jest

时间:2018-01-04 09:32:04

标签: javascript node.js testing mocking jestjs

任何想法如何模拟“导入”进行测试? 我现在用jest。

即:

//browser.js
export const browser = {
    id: undefined
};
export const getBrowser = function() {
    return browser;
};


//fetch-data.js
//code that uses the browser and I wanna test
import {getBrowser} from './../components/browser';

export const fetchData = function() {
     const browser = getBrowser();
     return Object.assign({dontcare:1}, browser);
};



//My test... Im using jest
import {fetchData} from './../fetch-data.js';
    expect(fetchData()).toBe({......});
};

现在在测试文件中我想模拟browser组件的响应......

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

你需要找到一种方法将getBrowser函数注入fetchData

export const fetchData = function(injectedFunction) {
     const browser = injectedFunction !== undefined?  injectedFunction() || getBrowser();
     return Object.assign({dontcare:1}, browser);
};
这样你就可以了 //你的测试......我正在使用jest

import {fetchData} from './../fetch-data.js';
import {getBrowser} from './../components/browser';
    let mockBrowser = mock(getBrowser);// <choose your mock library>
    // mock the behavior then inject it to the fetchData 
    expect(fetchData(mockBrowser)).toBe({......});
};

为什么在代码中应用依赖注入以便能够轻松测试

的原因

对我来说,你可以使用http://sinonjs.org/作为测试间谍,存根和嘲笑

答案 1 :(得分:0)

最后在其中一个帖子的帮助下解决了这个问题,但与Sinnon.js采用了不同的方式

1)我在测试中导入了浏览器组件:

A.method_to_call.calls

2)现在在我的测试中我会嘲笑我想要的方法:

import * as browserModule from './../components/browser';

3)从这里开始,我称之为测试对象并获得正确的模拟响应:)

答案 2 :(得分:0)

您在fetch-data.js中的功能取决于从<{1}导出。

您会发现browser.jsbrowser未定义,具体取决于您的jest configuration

由于getBrowser已准备就绪,可以导出,因此您可以使用browser.js来导入并在jest.requireActual(moduleName)中使用该模块。我将通过以下方式进行此操作:

fetch-data.js