如何在Jest中模拟导入的对象?

时间:2018-08-19 18:38:57

标签: jestjs

因此,我正在通过学​​习Jest的方式工作,在当前的Aurelia项目中,生成的main.js脚本的内部工作会导入配置对象(环境)。请注意,此代码全部为原始代码。

// main.js
import environment from './environment';
import {PLATFORM} from 'aurelia-pal';
import 'babel-polyfill';
import * as Bluebird from 'bluebird';

// remove out if you don't want a Promise polyfill (remove also from webpack.config.js)
Bluebird.config({ warnings: { wForgottenReturn: false } });

export function configure(aurelia) {
  aurelia.use
    .standardConfiguration()
    .feature(PLATFORM.moduleName('resources/index'));

  // Uncomment the line below to enable animation.
  // aurelia.use.plugin(PLATFORM.moduleName('aurelia-animator-css'));
  // if the css animator is enabled, add swap-order="after" to all router-view elements

  // Anyone wanting to use HTMLImports to load views, will need to install the following plugin.
  // aurelia.use.plugin(PLATFORM.moduleName('aurelia-html-import-template-loader'));

  if (environment.debug) {
    aurelia.use.developmentLogging();
  }

  if (environment.testing) {
    aurelia.use.plugin(PLATFORM.moduleName('aurelia-testing'));
  }

  return aurelia.start().then(() => aurelia.setRoot(PLATFORM.moduleName('app')));
}

environment对象仅包含几个简单值:

export default {
  debug: true,
  testing: true
};

现在,当我想测试main.js中的分支逻辑时,我希望能够翻转这些布尔值以确保它们执行或不执行适当的配置更改:

import {configure} from '../../src/main';
import environment from '../../src/environment';
/* later... */
  describe('when the environment is not set to debug', () => {
    environment.debug = false;
    it('should not configure development logging', () => {
      configure(aureliaMock);
      expect(aureliaMock.use.developmentLogging.mock.calls.length).toBe(0);
    });
  });

这不起作用,因为在environment函数中检查的configure()的版本在源模块中仍然具有值。我知道在这种情况下,environment是我的局部值,但是我不知道如何影响正在检查的environment实例。

我尝试使用与ES6类构造函数一起使用的jest.mock()语法,但这也不起作用。我可能会更改configure()签名以接受environment进行测试,但是在这样做之前,我想先看看是否有一种方法可以通过模拟进行此操作。

0 个答案:

没有答案