【发布时间】:2014-04-15 22:22:25
【问题描述】:
我正在尝试使用 Mongoose 模型测试用于保存小部件的服务功能。我想在我的模型上存根保存实例方法,但我想不出一个好的解决方案。我看过其他建议,但似乎都不完整。
这是我的模型...
// widget.js
var mongoose = require('mongoose');
var widgetSchema = mongoose.Schema({
title: {type: String, default: ''}
});
var Widget = mongoose.model('Widget', widgetSchema);
module.exports = Widget;
这是我的服务...
// widgetservice.js
var Widget = require('./widget.js');
var createWidget = function(data, callback) {
var widget = new Widget(data);
widget.save(function(err, doc) {
callback(err, doc);
});
};
我的服务很简单。它接受一些 JSON 数据,创建一个新的小部件,然后使用“保存”实例方法保存小部件。然后它会根据保存调用的结果回调传递 err 和 doc。
我只想在调用 createWidget({title: 'Widget A'}) 时进行测试...
- 使用我传递给服务函数的数据调用一次 Widget 构造函数
- 新创建的小部件对象上的保存实例方法被调用一次
- 额外的信用:保存实例方法以 null 为错误回调,{title: 'Widget A'} 为文档。
为了单独测试,我可能需要...
- 模拟或存根 Widget 构造函数,以便它返回我在测试中创建的模拟小部件对象。
- 存根模拟小部件对象的保存函数,以便我可以控制发生的情况。
我无法弄清楚如何使用诗乃做到这一点。我尝试了在 SO 页面上找到的几种变体,但都没有运气。
注意事项:
- 我不想将已构建的模型对象传递给服务,因为我希望服务成为唯一“了解”猫鼬的事物。
- 我知道这不是最重要的交易(只是通过更多的集成或端到端测试来测试它,但找出解决方案会很好。
感谢您提供的任何帮助。
【问题讨论】:
-
“我不想将已经构建的模型对象传递给服务,因为我希望服务成为唯一“了解”猫鼬的事物。”那么你应该使用依赖注入容器,而不是像现在这样依赖 nodejs 模块来注入依赖。或者至少有一种方法可以在您的服务中覆盖 Widget 类。使用 setter 注入,我认为现在您的脚本是不可测试的。
标签: javascript node.js unit-testing mongoose sinon