我正在尝试测试用于使用Mongoose模型保存小部件的服务功能。我想在模型上存入save实例方法,但是我找不到一个好的解决方案。我看到了其他建议,但似乎没有一个完整的建议。
这是我的模特...
// 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调用的结果回叫传递一个err和doc。
我只想在调用createWidget({title:'Widget A'})时进行测试...
为了单独进行测试,我可能需要...
我很难弄清楚如何用Sinon做到这一点。我尝试过SO网页上的几种变体,但是没有运气。
笔记:
感谢您的任何帮助,您可以提供。
如果要进行测试,这就是我的处理方式,首先要有一种方法将模拟的窗口小部件注入到窗口小部件服务中。我知道这里有node-hijack,嘲笑之类的东西,例如node-di,它们都有不同的样式,我敢肯定还有更多样式。选择一个并使用它。
一旦确定正确,就可以使用模拟小部件模块创建小部件服务。然后我做这样的事情(这是使用摩卡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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句