Stub save Instance Method of Mongoose Model With Sinon

前端 未结 3 441
死守一世寂寞
死守一世寂寞 2021-01-04 18:02

I am trying to test a service function I use to save a widget using a Mongoose model. I want to stub out the save instance method on my model, but I cannot figure out a good

3条回答
  •  星月不相逢
    2021-01-04 18:44

    If were to test that, this is how I would approach it, first have a way to inject my mocked widget to the widget-service. I know there's node-hijack, mockery or something like node-di, they all have different styles, I'm sure there's more. Choose one and use it.

    Once I get that right, then I create my widget-service with my mock widget module. Then I do something like this(this is using 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();
        });
    });
    

    This is just a sample, my tests sometimes get more complicated. It happens that most of the time, the backend calling function(here it is, widget.save) that I want to mock, is the one that I want it's behavior to change with every different test, so that's why I reset the stub everytime.

    Here's also another example for doing similar thing: https://github.com/mozilla-b2g/gaia/blob/16b7f7c8d313917517ec834dbda05db117ec141c/apps/sms/test/unit/thread_ui_test.js#L1614

提交回复
热议问题