Javascript 为什么我会得到;TypeError:无法读取属性';恢复';“未定义”的定义;用sinon.js打猫鼬时
我正试图用Sinon.js对猫鼬进行存根和模仿,但我得到了一个错误:Javascript 为什么我会得到;TypeError:无法读取属性';恢复';“未定义”的定义;用sinon.js打猫鼬时,javascript,node.js,unit-testing,mongoose,sinon,Javascript,Node.js,Unit Testing,Mongoose,Sinon,我正试图用Sinon.js对猫鼬进行存根和模仿,但我得到了一个错误:TypeError:cannotreadproperty'restore'of undefined。我尝试过搜索谷歌,但一点运气都没有。有人能告诉我我是否正确地处理了这个问题,如果是,我做错了什么,这个错误被抛出了。如果我在这件事上完全错了,我会很感激在正确的方向上有一点 这是我的模型/模式: var Mongoose = require("mongoose"); var Schema = Mongoose.Schema; e
TypeError:cannotreadproperty'restore'of undefined
。我尝试过搜索谷歌,但一点运气都没有。有人能告诉我我是否正确地处理了这个问题,如果是,我做错了什么,这个错误被抛出了。如果我在这件事上完全错了,我会很感激在正确的方向上有一点
这是我的模型/模式:
var Mongoose = require("mongoose");
var Schema = Mongoose.Schema;
exports = module.exports = function (host, database, port) {
var mySchema = new Schema({
name: {
type: String,
required: true,
unique: true
},
addresses: {
type: Array,
required: false
}
}, {
strict: true
});
mySchema.path('name').index({
unique: true
});
var db = Mongoose.createConnection(host, database);
var model = db.model('people', mySchema);
var getAllPeople = function (callback) {
var error = null,
data = null;
return model.find(function (err, people) {
if (!err) {
data = people;
} else {
error = err;
}
callback(error, people);
});
};
return {
Model: model,
getAllPeople: getAllPeople
};
}
这是我使用Mocha&chai进行测试的规范:
var expect = require("chai").expect;
var sinon = require("sinon");
var PeopleProvider = require("../models/mySchema.js")("localhost", "test_db");
describe("Unit tests with sinon", function () {
it("Test: stubbing find for getAllPeople", function (done) {
var stub = sinon.stub(PeopleProvider.Model.prototype, 'find', function () {
return [{
name: "John",
addresses: ["abc", "123", "xyz"]
}, {
name: "Jane",
addresses: ["123 fake st", "somewhereville"]
}, {
name: "Joe",
addresses: ["someplace", "overthere", "here"]
}];
});
results = PeopleProvider.getAllPeople(function (error, data) {
expect(data instanceof Array).to.equal(true);
expect(data.length).to.equal(3);
expect(data[0].name).to.equal("John");
expect(data[0].addresses.length).to.equal(3);
expect(data[0].addresses[0]).to.equal("abc");
expect(data[1].name).to.equal("Jane");
expect(data[1].addresses.length).to.equal(2);
expect(data[1].addresses[0]).to.equal("somewhereville");
expect(data[2].name).to.equal("Joe");
expect(data[2].addresses.length).to.equal(3);
expect(data[2].addresses[0]).to.equal("someplace");
done();
});
});
});
这是我的堆栈错误:
1) Unit tests with sinon Test: stubbing find for getAllPeople:
TypeError: Cannot read property 'restore' of undefined
at Object.wrapMethod (C:\~censored~\node_modules\sinon\lib\sinon.js:74:30)
at Object.stub (C:\~censored~\node_modules\sinon\lib\sinon\stub.js:56:22)
at Context.<anonymous> (C:\~censored~\test\myModelSpec.js:8:22)
at Test.Runnable.run (C:\Users\~censored~\AppData\Roaming\npm\node_modules\mocha\lib\runnable.js:204:15)
at Runner.runTest (C:\Users\~censored~\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:374:10)
at C:\Users\~censored~\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:452:12
at next (C:\Users\~censored~\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:299:14)
at C:\Users\~censored~\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:309:7
at next (C:\Users\~censored~\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:247:23)
at Object._onImmediate (C:\Users\~censored~\AppData\Roaming\npm\node_modules\mocha\lib\runner.js:276:5)
at processImmediate [as _immediateCallback] (timers.js:330:15)
1)使用sinon测试的单元测试:为getAllPeople进行存根查找:
TypeError:无法读取未定义的属性“restore”
在Object.wrapMethod(C:\~censtered~\node\u modules\sinon\lib\sinon.js:74:30)
在Object.stub(C:\~censtered~\node\u modules\sinon\lib\sinon\stub.js:56:22)
在上下文中。(C:\~censtered~\test\myModelSpec.js:8:22)
在Test.Runnable.run(C:\Users\~censeded~\AppData\Roaming\npm\node\u modules\mocha\lib\Runnable.js:204:15)
在Runner.runTest(C:\Users\~censtered~\AppData\Roaming\npm\node\u modules\mocha\lib\Runner.js:374:10)
在C:\Users\~censtered~\AppData\Roaming\npm\node\u modules\mocha\lib\runner.js:452:12
下一步(C:\Users\~censtered~\AppData\Roaming\npm\node\u modules\mocha\lib\runner.js:299:14)
在C:\Users\~censtered~\AppData\Roaming\npm\node\u modules\mocha\lib\runner.js:309:7
下一步(C:\Users\~censtered~\AppData\Roaming\npm\node\u modules\mocha\lib\runner.js:247:23)
at Object.\u onImmediate(C:\Users\~censtered~\AppData\Roaming\npm\node\u modules\mocha\lib\runner.js:276:5)
在processImmediate[as_immediateCallback](timers.js:330:15)
问题是,我在网上找到了很多代码片段,并试图按照它们的指示对原型进行存根,所以我改变了主意
var stub = sinon.stub(PeopleProvider.Model.prototype, 'find', somefunction);
到
在修复此错误后,我还意识到我也丢失了回调,因此下面是测试的全部更改:
it("Test: stubbing find for getAllPeople", function (done) {
var stub = sinon.stub(PeopleProvider.model, 'find', function (callback) {
var results = [{
name: "John",
addresses: ["abc", "123", "xyz"]
}, {
name: "Jane",
addresses: ["123 fake st", "somewhereville"]
}, {
name: "Joe",
addresses: ["someplace", "overthere", "here"]
}];
callback(null, results);
});
PeopleProvider.getAllPeople(function (error, data) {
expect(data instanceof Array).to.equal(true);
expect(data.length).to.equal(3);
expect(data[0].name).to.equal("John");
expect(data[0].addresses.length).to.equal(3);
expect(data[0].addresses[0]).to.equal("abc");
expect(data[1].name).to.equal("Jane");
expect(data[1].addresses.length).to.equal(2);
expect(data[1].addresses[0]).to.equal("123 fake st");
expect(data[2].name).to.equal("Joe");
expect(data[2].addresses.length).to.equal(3);
expect(data[2].addresses[0]).to.equal("someplace");
done();
});
});
it("Test: stubbing find for getAllPeople", function (done) {
var stub = sinon.stub(PeopleProvider.model, 'find', function (callback) {
var results = [{
name: "John",
addresses: ["abc", "123", "xyz"]
}, {
name: "Jane",
addresses: ["123 fake st", "somewhereville"]
}, {
name: "Joe",
addresses: ["someplace", "overthere", "here"]
}];
callback(null, results);
});
PeopleProvider.getAllPeople(function (error, data) {
expect(data instanceof Array).to.equal(true);
expect(data.length).to.equal(3);
expect(data[0].name).to.equal("John");
expect(data[0].addresses.length).to.equal(3);
expect(data[0].addresses[0]).to.equal("abc");
expect(data[1].name).to.equal("Jane");
expect(data[1].addresses.length).to.equal(2);
expect(data[1].addresses[0]).to.equal("123 fake st");
expect(data[2].name).to.equal("Joe");
expect(data[2].addresses.length).to.equal(3);
expect(data[2].addresses[0]).to.equal("someplace");
done();
});
});