【发布时间】:2016-03-25 03:48:53
【问题描述】:
我已经浏览了几篇与使用 mongoose 进行单元测试 mocha/sinon 相关的帖子,但我仍然无法验证是否在我的 mongoose 模型上调用了 save 方法。我想测试我的控制器中调用了 order.save 。我得到的错误是 order.save 不是生产代码 orderController.js 中的函数。
我尝试了几种不同的方法,但无法断言调用了 save。
一个简单的模型:
orderModel.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;
这是规格文件。我想验证是否调用了 save,不管它是存根、间谍还是模拟。我只是无法在调用 ctrl.post 后断言它被调用了
orderController.spec.js
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);
});
});
【问题讨论】:
-
只是一些快速重新格式化代码,您可能想研究“markdown”标记语言的工作方式,因为这是 SO 使用的,缩进 4 个空格使其成为您的代码块'已经放入了一段普通的文字;)