无法断言在单元测试中调用了mongoose save函数
我已经浏览了好几篇关于使用mongoose对mocha/sinon进行单元测试的文章,但是我仍然没有让它工作,以验证我的mongoose模型是否调用了save方法。我想测试该顺序。在我的控制器中调用了save。我得到的错误是order.save不是生产代码orderController.js中的函数 我尝试了几种不同的方法,但无法断言调用了save 一个简单的模型: orderModel.js无法断言在单元测试中调用了mongoose save函数,mongoose,mocha.js,sinon,Mongoose,Mocha.js,Sinon,我已经浏览了好几篇关于使用mongoose对mocha/sinon进行单元测试的文章,但是我仍然没有让它工作,以验证我的mongoose模型是否调用了save方法。我想测试该顺序。在我的控制器中调用了save。我得到的错误是order.save不是生产代码orderController.js中的函数 我尝试了几种不同的方法,但无法断言调用了save 一个简单的模型: orderModel.js const mongoose = require('mongoose'), Schema =
const mongoose = require('mongoose'),
Schema = mongoose.Schema;
const orderModel = new Schema({
location: {type: String},
cost: {type: Number},
status: {type: String, default: 'unpaid'}
});
module.exports = mongoose.model('Order', orderModel);
The controller is the production code that I want to test
orderController.js
var orderController = function (Order) {
var post = function (req, res) {
var order = new Order();
order.save();
res.status(201);
}
return {
post: post
}
}
module.exports = orderController;
var sinon = require('sinon'),
chai = require('chai'),
expect = chai.expect,
mongoose = require('mongoose');
describe('Order Controller', function() {
it('should save an order', function() {
var Order = require('../../app/models/orderModel');
var orderStub = sinon.stub(Order.prototype, 'save');
var ctrl = require('../../app/controllers/orderController')(orderStub);
var req, res;
req = res = {};
res.status = sinon.spy();
ctrl.post(req, res);
sinon.assert.called(orderStub.prototype.save);
});
});
describe('Order Controller', function() {
it('should save an order', sinon.test(function(done) {
var saveStub = sinon.stub();
var Order = this.stub(models, 'Order');
Order.returns({
save: saveStub
});
const ctrl = require('../../app/controllers/orderController') (Order);
ctrl.post(req, res);
sinon.assert.calledOnce(saveStub);
});
这是规范文件。我想验证是否调用了save,不管它是存根、间谍还是模拟。在调用ctrl.post之后,我无法断言它被调用了
orderController.spec.js
const mongoose = require('mongoose'),
Schema = mongoose.Schema;
const orderModel = new Schema({
location: {type: String},
cost: {type: Number},
status: {type: String, default: 'unpaid'}
});
module.exports = mongoose.model('Order', orderModel);
The controller is the production code that I want to test
orderController.js
var orderController = function (Order) {
var post = function (req, res) {
var order = new Order();
order.save();
res.status(201);
}
return {
post: post
}
}
module.exports = orderController;
var sinon = require('sinon'),
chai = require('chai'),
expect = chai.expect,
mongoose = require('mongoose');
describe('Order Controller', function() {
it('should save an order', function() {
var Order = require('../../app/models/orderModel');
var orderStub = sinon.stub(Order.prototype, 'save');
var ctrl = require('../../app/controllers/orderController')(orderStub);
var req, res;
req = res = {};
res.status = sinon.spy();
ctrl.post(req, res);
sinon.assert.called(orderStub.prototype.save);
});
});
describe('Order Controller', function() {
it('should save an order', sinon.test(function(done) {
var saveStub = sinon.stub();
var Order = this.stub(models, 'Order');
Order.returns({
save: saveStub
});
const ctrl = require('../../app/controllers/orderController') (Order);
ctrl.post(req, res);
sinon.assert.calledOnce(saveStub);
});
我在别处得到了一些帮助,使它能够工作 orderController.spec.js
const mongoose = require('mongoose'),
Schema = mongoose.Schema;
const orderModel = new Schema({
location: {type: String},
cost: {type: Number},
status: {type: String, default: 'unpaid'}
});
module.exports = mongoose.model('Order', orderModel);
The controller is the production code that I want to test
orderController.js
var orderController = function (Order) {
var post = function (req, res) {
var order = new Order();
order.save();
res.status(201);
}
return {
post: post
}
}
module.exports = orderController;
var sinon = require('sinon'),
chai = require('chai'),
expect = chai.expect,
mongoose = require('mongoose');
describe('Order Controller', function() {
it('should save an order', function() {
var Order = require('../../app/models/orderModel');
var orderStub = sinon.stub(Order.prototype, 'save');
var ctrl = require('../../app/controllers/orderController')(orderStub);
var req, res;
req = res = {};
res.status = sinon.spy();
ctrl.post(req, res);
sinon.assert.called(orderStub.prototype.save);
});
});
describe('Order Controller', function() {
it('should save an order', sinon.test(function(done) {
var saveStub = sinon.stub();
var Order = this.stub(models, 'Order');
Order.returns({
save: saveStub
});
const ctrl = require('../../app/controllers/orderController') (Order);
ctrl.post(req, res);
sinon.assert.calledOnce(saveStub);
});
我在别处得到了一些帮助,使它能够工作 orderController.spec.js
const mongoose = require('mongoose'),
Schema = mongoose.Schema;
const orderModel = new Schema({
location: {type: String},
cost: {type: Number},
status: {type: String, default: 'unpaid'}
});
module.exports = mongoose.model('Order', orderModel);
The controller is the production code that I want to test
orderController.js
var orderController = function (Order) {
var post = function (req, res) {
var order = new Order();
order.save();
res.status(201);
}
return {
post: post
}
}
module.exports = orderController;
var sinon = require('sinon'),
chai = require('chai'),
expect = chai.expect,
mongoose = require('mongoose');
describe('Order Controller', function() {
it('should save an order', function() {
var Order = require('../../app/models/orderModel');
var orderStub = sinon.stub(Order.prototype, 'save');
var ctrl = require('../../app/controllers/orderController')(orderStub);
var req, res;
req = res = {};
res.status = sinon.spy();
ctrl.post(req, res);
sinon.assert.called(orderStub.prototype.save);
});
});
describe('Order Controller', function() {
it('should save an order', sinon.test(function(done) {
var saveStub = sinon.stub();
var Order = this.stub(models, 'Order');
Order.returns({
save: saveStub
});
const ctrl = require('../../app/controllers/orderController') (Order);
ctrl.post(req, res);
sinon.assert.calledOnce(saveStub);
});
只需对代码进行一些快速重新格式化,您可能需要研究“标记”标记语言的工作方式,因为这是SO所使用的,缩进4个空格使其成为一个代码块,您可以在其中放入一段常规的文本;)只需对代码进行一些快速重新格式化,您可能需要研究“标记”标记语言的工作方式,因为这是SO所使用的,缩进4个空格使其成为一个代码块,您可以在其中放入一段常规的文本;)