如何模拟 ES6 模块的导入?
我有以下ES6模块:
文件网络.js
export function getDataFromServer() {
return ...
}
文件小部件.js
import { getDataFromServer } from 'network.js';
export class Widget() {
constructor() {
getDataFromServer("dataForWidget")
.then(data => this.render(data));
}
render() {
...
}
}
我正在寻找一种方法来测试带有模拟实例的 Widget。如果我使用单独的s而不是ES6模块,就像在Karma中一样,我可以像这样编写我的测试:getDataFromServer
<script>
describe("widget", function() {
it("should do stuff", function() {
let getDataFromServer = spyOn(window, "getDataFromServer").andReturn("mockData")
let widget = new Widget();
expect(getDataFromServer).toHaveBeenCalledWith("dataForWidget");
expect(otherStuff).toHaveHappened();
});
});
但是,如果我在浏览器之外单独测试ES6模块(如Mocha + Babel),我会这样写:
import { Widget } from 'widget.js';
describe("widget", function() {
it("should do stuff", function() {
let getDataFromServer = spyOn(?????) // How to mock?
.andReturn("mockData")
let widget = new Widget();
expect(getDataFromServer).toHaveBeenCalledWith("dataForWidget");
expect(otherStuff).toHaveHappened();
});
});
好吧,但是现在不可用(好吧,根本没有),我不知道如何将东西直接注入自己的范围。getDataFromServer
window
window
widget.js
那么我该何去何从呢?
- 有没有办法访问
小部件的范围.js
,或者至少用我自己的代码替换其导入? - 如果没有,我怎样才能使
Widget
可测试?
我考虑过的东西:
一个。手动依赖注入。
从中删除所有导入,并期望调用方提供 deps。widget.js
export class Widget() {
constructor(deps) {
deps.getDataFromServer("dataForWidget")
.then(data => this.render(data));
}
}
我对像这样搞砸Widget的公共界面并公开实现细节感到非常不舒服。不行。
b.公开导入以允许模拟它们。
像这样:
import { getDataFromServer } from 'network.js';
export let deps = {
getDataFromServer
};
export class Widget() {
constructor() {
deps.getDataFromServer("dataForWidget")
.then(data => this.render(data));
}
}
然后:
import { Widget, deps } from 'widget.js';
describe("widget", function() {
it("should do stuff", function() {
let getDataFromServer = spyOn(deps.getDataFromServer) // !
.andReturn("mockData");
let widget = new Widget();
expect(getDataFromServer).toHaveBeenCalledWith("dataForWidget");
expect(otherStuff).toHaveHappened();
});
});
这侵入性较小,但它需要我为每个模块编写大量样板,并且仍然存在我使用而不是一直使用的风险。我对此感到不安,但这是我迄今为止最好的主意。getDataFromServer
deps.getDataFromServer