Proxyquire不会截断我所需的课程

时间:2017-03-02 08:21:14

标签: javascript unit-testing es6-class proxyquire

我的课程AProvider需要'./b.provider'

const BProvider = require('./b.provider');

class AProvider {
  static get defaultPath() {
    return `defaults/a/${BProvider.getThing()}`;
  }
}

module.exports = AProvider;

b.provider.jsa.provider.js相邻,看起来像

global.stuff.whatever = require('../models').get('Whatever'); // I didn't write this!

class BProvider {
  static getThing() {
    return 'some-computed-thing';
  }
}
module.exports = BProvider;

在我的测试中,我使用proxyquire模拟./b.provider,如下所示:

import { expect } from 'chai';
import proxyquire from 'proxyquire';

describe('A Provider', () => {
  const Provider = proxyquire('../src/a.provider', {
    './b.provider': {
      getThing: () => 'b-thing'
    },
  });

  describe('defaultPath', () => {
    it('has the expected value', () => {
      expect(Provider.defaultPath).to.equal('defaults/a/b-thing')
    });
  });
});

但是,当我运行测试时BProvider仍需要实际的'./b.provider'而不是存根,BProvider对global.stuff.whatever的引用会引发错误。

为什么这不起作用?

1 个答案:

答案 0 :(得分:5)

关于为什么会发生这种情况的答案如下

proxyquire在将其删除之前仍然需要底层代码。它这样做是为了启用呼叫。

解决方案只是明确禁止调用。

测试成为:

import { expect } from 'chai';
import proxyquire from 'proxyquire';

describe('A Provider', () => {
  const Provider = proxyquire('../src/a.provider', {
    './b.provider': {
      getThing: () => 'b-thing',
      '@noCallThru': true
    },
  });

  describe('defaultPath', () => {
    it('has the expected value', () => {
      expect(Provider.defaultPath).to.equal('defaults/a/b-thing')
    });
  });
});

运行此测试非常有效。