使用jest在组件中进行javascript模拟导入
知道如何模拟“导入”进行测试吗? 我现在开玩笑 即: 现在在测试文件中,我想模拟使用jest在组件中进行javascript模拟导入,javascript,node.js,testing,mocking,jestjs,Javascript,Node.js,Testing,Mocking,Jestjs,知道如何模拟“导入”进行测试吗? 我现在开玩笑 即: 现在在测试文件中,我想模拟浏览器组件的响应 有什么想法吗 谢谢 您需要找到将getBrowser函数注入fetchData的方法 export const fetchData = function(injectedFunction) { const browser = injectedFunction !== undefined? injectedFunction() || getBrowser(); return Ob
浏览器
组件的响应
有什么想法吗
谢谢 您需要找到将
getBrowser
函数注入fetchData的方法
export const fetchData = function(injectedFunction) {
const browser = injectedFunction !== undefined? injectedFunction() || getBrowser();
return Object.assign({dontcare:1}, browser);
};
这样你现在就可以
//你的测试。。。我在开玩笑
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({......});
};
从'/../fetch data.js'导入{fetchData};
从“/../components/browser”导入{getBrowser};
让mockBrowser=mock(getBrowser);//
//模拟该行为,然后将其注入fetchData
expect(fetchData(mockBrowser)).toBe({……});
};
这就是为什么在代码中应用依赖注入能够轻松测试它的原因
对我来说,你可以使用测试间谍、存根和模拟在其中一篇文章的帮助下最终解决了这个问题,但使用Sinnon.js的方式有所不同 1) 我在测试中导入浏览器组件:
import * as browserModule from './../components/browser';
2) 现在在我的测试中,我将模拟我想要的方法:
sinon.stub(browserModule, 'getBrowser').returns({id: 1});
3) 从这里一切顺利,我调用了我的测试对象,它得到了正确的模拟响应:)您在
获取数据.js
中的函数依赖于从浏览器.js
导出
您会发现browser
和getBrowser
都是未定义的,具体取决于您的应用程序
由于browser.js
已准备好导出,您可以使用jest.requireActual(moduleName)
在fetch data.js
中导入并使用该模块。我会用以下方法:
jest.mock(“./browser”,()=>{
const br=开玩笑的要求(“浏览器”);
返回{
…br,
浏览器:{id:'changed value'}
};
})
当然,在其他语言中使用DI,但从未见过js的DI。有什么建议吗?您只需在其中传递参数,并检查参数是否未定义。这样做的唯一目的是,您可以模拟对象/方法进行测试,而无需其他操作。在测试中,您可以通过模拟对象/方法,但在生产代码中,您没有通过对象/方法。行const browser=injectedFunction!==未定义?injectedFunction()| | getBrowser()代码>将为您执行此操作如果参数未定义,它将执行getBrowser(),如果参数未定义,则执行此参数。这样你就可以模拟执行过程中的内容
sinon.stub(browserModule, 'getBrowser').returns({id: 1});