如何存根Mongoose模型构造函数

时间:2016-11-14 07:05:34

标签: javascript node.js mongodb mongoose sinon

我试图使用Sinon.js来存储我的Student Mongoose模型的模型构造函数。

var Student = require('../models/student');

var student = new Student({ name: 'test student' }); // I want to stub this constructor

查看Mongoose源代码,ModelDocument继承其原型,它调用Document函数,所以这是我为了存根构造函数而尝试的。但是,我的存根永远不会被调用。

sinon.stub(Student.prototype__proto__, 'constructor', () => {
  console.log('This does not work!');
  return { name: 'test student' };
});

createStudent(); // Doesn't print anything

感谢您的任何见解。

编辑: 我无法直接将Student()设置为存根,因为我还在另一个测试中存根Student.find()。所以我的问题基本上是"如何同时存根Student()Student.find()?"

1 个答案:

答案 0 :(得分:2)

肯定只能用sinon来完成,但这将非常依赖于lib的工作方式,并且不会感到安全和可维护。

对于难以直接模拟的依赖项,您应该查看rewireproxyquire(我使用重新连线,但您可能想要选择)来做猴子修补"

您将rewire使用require,但它有一些糖。 示例:

var rewire = require("rewire");
var myCodeToTest = rewire("../path/to/my/code");

//Will make 'var Student' a sinon stub.
myCodeToTest.__set__('Student', sinon.stub().returns({ name: 'test'}));

//Execute code
myCodeToTest(); // or myCodeToTest.myFunction() etc..

//assert
expect...

[编辑]

  

"如何同时存根Student()和Student.find()?"

//Will make 'var Student' a sinon stub.
var findStub = sinon.stub().returns({});
var studentStub = sinon.stub().returns({find: findStub});
myCodeToTest.__set__('Student', studentStub);