我有以下ES6模块:
文件network.js
export function getDataFromServer() {
return ...
}
文件widget.js
import { getDataFromServer } from 'network.js';
export class Widget() {
constructor() {
getDataFromServer("dataForWidget")
.then(data => this.render(data));
}
render() {
...
}
}
我正在寻找一种用getDataFromServer
的模拟实例来测试小部件的方法。如果我使用单独的<script>
模块而不是ES6模块,就像在Karma中一样,我可以这样写我的测试:
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
自己的作用域中。
那么我该怎么做呢?
有一种方法可以访问
widget.js
**,的作用域,或者至少用我自己的code?**Widget
testable?我考虑过的东西:
a.手动依赖注入。
从widget.js
中删除所有导入,并期望调用者提供deps。
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
的风险。我对此感到不安,但这是到目前为止我最好的想法。
https://stackoverflow.com/questions/35240469
复制相似问题