【问题标题】:How do I use Jasmine to spy on a function that is imported via an ES6 default export?如何使用 Jasmine 监视通过 ES6 默认导出导入的函数?
【发布时间】:2016-03-10 20:24:07
【问题描述】:

我正在开发一个 Redux 应用程序并尝试在 ES6 默认导出函数上使用 Jasmine 创建一个间谍。我尝试了几种不同的方法来监视该函数,包括使用通配符导入来访问导入的“默认”属性,但到目前为止我没有尝试过任何工作。下面是一个示例,我想测试widgets.js 并监视小部件功能。有没有办法实现这一点而不必改变我从widget.js导出函数的方式?

widget.js

import { Map } from 'immutable';
import { CREATE_WIDGET } from 'actions';

const initialState = Map({
  id: undefined,
  name: undefined
});

export default function widget(state=initialState, action) {
  switch (action.type) {
    case CREATE_WIDGET:
      return state.update((widget) => widget.merge(action.widget));

    default:
      return state;
  }
}

widgets.js

import { OrderedMap } from 'immutable';
import { CREATE_ROOM } from 'actions';
import widget from './widget';

const initialState = OrderedMap();

export default function widgets(state=initialState, action={}) {
  switch (action.type) {
    case CREATE_ROOM:
      return state.set(action.widget.id, widget(undefined, action));

    default:
      return state;
  }
}

【问题讨论】:

  • 您有办法使用命名导出来做您想做的事情吗?它们实际上并没有那么不同。
  • 不,我不知道。有人告诉我这个插件,但是,我无法让它正常运行,我觉得我可能只需要将函数导出为对象上的方法。

标签: javascript jasmine ecmascript-6 redux


【解决方案1】:

您说您尝试导入通配符并监视默认值?这种方法有什么问题?我刚刚遇到了这个问题,这样做为我解决了这个问题:

import * as widget from './widget';

describe('widget spec', () => {
    beforeEach(() => {
        spyOn(widget, 'default');
    });
});

【讨论】:

  • 这个问题是你删除了在构建时发生 tree-shaking 的能力。您希望通过导入您实际使用的部分来尽可能优化。
  • 这并不重要,因为生产代码不应该包含测试文件
  • 我收到一个错误“未声明为可写或没有设置器”。
  • 尚未尝试使用默认导出函数,但 spyOnProperty(widget, 'default').and.callThrough() 可以像我一样为您工作。
猜你喜欢
  • 2015-12-29
  • 2019-06-12
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 2016-09-17
相关资源
最近更新 更多