如何存根扩展的ES6课程'与诗乃的构造函数

时间:2018-01-09 17:07:24

标签: javascript node.js ecmascript-6 mocha sinon

所以我在使用存根构造函数时遇到了一些问题,并且更多的继承类构造函数... 我将从一些示例代码片段开始:

Parent.js

module.exports = class Parent {
  constructor (){
    // code I don't want to run during tests
  }
}

MyClass.js

let Parent = require('path/to/Parent');

module.exports = class MyClass extends Parent {
  // no overridden constructor
}

摩卡测试

let MyClass = require('path/to/MyClass')

...

test('test1', (done) => {
  // I want to stub the MyClass/Parent constructor before creating a new instance
  // of MyClass so that the constructor code in Parent doesn't run

  let myClass = new MyClass();
  // assertions 'n' stuff
  return done();
});

...

我已经尝试了一些事情,但总是发现父构造函数中的代码无论我做什么都会运行...我有一种感觉它可能与MyClass需要Parent之前有关把它存下来的机会。

我也尝试过使用重新连接替换MyClass中的变量,但也没有喜欢那里; e.g。

let MyClass = rewire('path/to/MyClass');
MyClass.__set__('Parent', sinon.stub());

关于我如何实现我在这里尝试做的任何建议/帮助?

2 个答案:

答案 0 :(得分:0)

我没有使用重新连接所以我不确定为什么它不起作用但是使用proxyquire来保存父构造函数可以正常工作:

const MockParent = sinon.stub()
const MyClass = proxyquire('../../some/path', {
  './Parent': MockParent
})

答案 1 :(得分:0)

module.exports = class MyClass extends Parent {
  // no overridden constructor
}

等于:

module.exports = class MyClass extends Parent {
  constructor (...args) {
     super(...args) // be equal to Parent.call(this, ...args)
  }
}

因此,这些流程是新的MyClass() - > MyClass构造函数() - > Parent.call() - >父构造函数()