Sinon猫鼬模型的存根保存实例方法

凯文

我正在尝试测试用于使用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'})时进行测试...

  • 使用我传递给服务函数的数据一次调用Widget构造函数
  • 新创建的小部件对象上的save实例方法被调用一次
  • 额外信用:save实例方法以err的null值和文档的{title:'Widget A'}的值进行回调。

为了单独进行测试,我可能需要...

  • 模拟或存根Widget构造函数,以便它将返回我在测试中创建的模拟Widget对象。
  • 将模拟小部件对象的保存功能存根,以便我可以控制发生的情况。

我很难弄清楚如何用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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Sinon对猫鼬模型进行存根

来自分类Dev

如何使用Sinon在单元测试中对猫鼬模型方法进行存根

来自分类Dev

用sinon模拟/存根猫鼬findById

来自分类Dev

如何声明sinon猫鼬存根

来自分类Dev

用sinon模拟/存根猫鼬findById

来自分类Dev

猫鼬实例方法“ this”未引用模型

来自分类Dev

如何在猫鼬模型中存根方法?

来自分类Dev

在模型上存入猫鼬保存方法

来自分类Dev

猫鼬模式检查是否首次保存了模型实例

来自分类Dev

如何在Sinon中存根具有多个参数的猫鼬方法?

来自分类Dev

sinon:如何存根实例方法

来自分类Dev

猫鼬保存参考模型

来自分类Dev

Mocha + Sinon 测试猫鼬方法被调用

来自分类Dev

猫鼬模式检查是否第一次保存了模型实例

来自分类Dev

用jsdoc记录猫鼬模型方法

来自分类Dev

如何保存()DB.find({})用猫鼬的方法返回的所有模型

来自分类Dev

如何保存()DB.find({})用猫鼬的方法返回的所有模型

来自分类Dev

如何保存()DB.find({})用猫鼬的方法返回的所有模型

来自分类Dev

猫鼬中的保存方法失败

来自分类Dev

设计猫鼬模型

来自分类Dev

导出猫鼬模型

来自分类Dev

猫鼬模型保存错误E11000

来自分类Dev

猫鼬:无法将嵌套对象保存到嵌套模型

来自分类Dev

模型未使用猫鼬保存到MongoDB

来自分类Dev

保存猫鼬模型时更新会话数据

来自分类Dev

猫鼬保存错误

来自分类Dev

猫鼬模式方法:错误-模型方法不是函数

来自分类Dev

实例方法如何在猫鼬中工作?

来自分类Dev

猫鼬-如何为所有模型创建通用方法?