javascript – 用Sinon保存Mongoose模型的实例方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 用Sinon保存Mongoose模型的实例方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3408字,纯文字阅读大概需要5分钟。
内容图文
![javascript – 用Sinon保存Mongoose模型的实例方法](/upload/InfoBanner/zyjiaocheng/700/8e9663f68fe14cc89f7cbd0cb0e6ceb5.jpg)
我正在尝试使用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数据,创建一个新的小部件,然后使用“save”实例方法保存小部件.然后它根据保存调用的结果回调传递错误和doc.
当我调用createWidget时,我只想测试它({title:’Widget A’})…
>使用传递给服务函数的数据调用Widget构造函数一次
>一次调用新创建的窗口小部件对象上的save实例方法
> EXTRA CREDIT:保存实例方法为错误调用null,为文档调用{title:’Widget A’}.
为了单独测试这个,我可能需要……
>模拟或存根Widget构造函数,以便它返回我作为测试的一部分创建的模拟小部件对象.
>存储模拟小部件对象的保存功能,以便我可以控制发生的事情.
我无法弄清楚如何用Sinon做到这一点.我已经尝试过在SO页面上找到的几个变种而没有运气.
笔记:
>我不想将已经构造的模型对象传递给服务,因为我希望服务是唯一“知道”mongoose的东西.
>我知道这不是最大的交易(只是通过更多的集成或端到端测试来测试它,但是找出解决方案会很好.
感谢您的任何帮助,您可以提供.
解决方法:
如果要测试它,这就是我接近它的方法,首先要有一种方法将我的模拟小部件注入到widget-service中.我知道有node-hijack,mockery或类似于node-di,它们都有不同的风格,我相信还有更多.选择一个并使用它.
一旦我做对了,然后我用我的模拟小部件模块创建我的小部件服务.然后我做这样的事情(这是使用mocha btw):
// Either do this:
saveStub = sinon.stub();
function WidgetMock(data) {
// some mocking stuff
// ...
// Now add my mocked stub.
this.save = saveStub;
}
// or do this:
WidgetMock = require('./mocked-widget');
var saveStub = sinon.stub(WidgetMock.prototype, 'save');
diInject('widget', WidgetMock); // This function doesn't really exists, but it should
// inject your mocked module instead of real one.
beforeEach(function () {
saveStub.reset(); // we do this, so everytime, when we can set the stub only for
// that test, and wouldn't clash with other tests. Don't do it, if you want to set
// the stub only one time for all.
});
after(function () {
saveStub.restore();// Generally you don't need this, but I've seen at times, mocked
// objects clashing with other mocked objects. Make sure you do it when your mock
// object maybe mocked somewhere other than this test case.
});
it('createWidget()', function (done) {
saveStub.yields(null, { someProperty : true }); // Tell your stub to do what you want it to do.
createWidget({}, function (err, result) {
assert(!err);
assert(result.someProperty);
sinon.assert.called(saveStub); // Maybe do something more complicated. You can
// also use sinon.mock instead of stubs if you wanna assert it.
done();
});
});
it('createWidget(badInput)', function (done) {
saveStub.yields(new Error('shhoo'));
createWidget({}, function (err, result) {
assert(err);
done();
});
});
这只是一个例子,我的测试有时会变得更复杂.它发生在大多数情况下,我想要模拟的后端调用函数(这里是widget.save)是我希望它的行为随着每个不同的测试而改变的,所以这就是我每次重置存根的原因.
这也是做类似事情的另一个例子:https://github.com/mozilla-b2g/gaia/blob/16b7f7c8d313917517ec834dbda05db117ec141c/apps/sms/test/unit/thread_ui_test.js#L1614
内容总结
以上是互联网集市为您收集整理的javascript – 用Sinon保存Mongoose模型的实例方法全部内容,希望文章能够帮你解决javascript – 用Sinon保存Mongoose模型的实例方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。