首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何模拟ES6模块的导入?

如何模拟ES6模块的导入?
EN

Stack Overflow用户
提问于 2016-02-06 19:28:40
回答 10查看 80.4K关注 0票数 162

我有以下ES6模块:

文件network.js

代码语言:javascript
运行
复制
export function getDataFromServer() {
  return ...
}

文件widget.js

代码语言:javascript
运行
复制
import { getDataFromServer } from 'network.js';

export class Widget() {
  constructor() {
    getDataFromServer("dataForWidget")
    .then(data => this.render(data));
  }

  render() {
    ...
  }
}

我正在寻找一种用getDataFromServer的模拟实例来测试小部件的方法。如果我使用单独的<script>模块而不是ES6模块,就像在Karma中一样,我可以这样写我的测试:

代码语言:javascript
运行
复制
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 ),我会编写如下代码:

代码语言:javascript
运行
复制
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();
  });
});

好吧,但是现在getDataFromServerwindow中是不可用的(好吧,根本没有window ),而且我不知道有什么方法可以直接把东西注入到widget.js自己的作用域中。

那么我该怎么做呢?

有一种方法可以访问

  1. Is widget.js**,的作用域,或者至少用我自己的code?**
  2. If替换它的导入不,how can I make Widget testable?

我考虑过的东西:

a.手动依赖注入。

widget.js中删除所有导入,并期望调用者提供deps。

代码语言:javascript
运行
复制
export class Widget() {
  constructor(deps) {
    deps.getDataFromServer("dataForWidget")
    .then(data => this.render(data));
  }
}

我对这样弄乱Widget的公共接口并暴露实现细节感到非常不舒服。不行。

b.公开导入以允许模拟它们。

类似于:

代码语言:javascript
运行
复制
import { getDataFromServer } from 'network.js';

export let deps = {
  getDataFromServer
};

export class Widget() {
  constructor() {
    deps.getDataFromServer("dataForWidget")
    .then(data => this.render(data));
  }
}

然后:

代码语言:javascript
运行
复制
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的风险。我对此感到不安,但这是到目前为止我最好的想法。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35240469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档