Sinon calledWith和calledWatchMatch失败,对象编辑:Sinon间谍对象构造函数

时间:2017-08-29 20:08:49

标签: javascript node.js unit-testing sinon sinon-chai

我是单元测试的新手,我正在使用Mocha,Sinon和Chai来测试NodeJs代码。问题是我对stub.calledWith()的期望总是在它是一个对象时失败,即使测试错误显示两个语法相同的对象。

我正在使用Sinon来存储一个mongoose模型的save方法,并检查是否使用正确的详细信息调用了这个存根。

我正在测试的功能:

async function createGroup(details) {
        'use strict';
        Logger.info(`create group called`);
        const group   = new UserGroup(this.formatGroup(details));
        const result = await group.save();
        Logger.verbose(`results of save: ${JSON.stringify(result)}`);
        return result;
}

单元测试

describe('object creation', function () {
        'use strict';
        const saveStub   = sinon.stub(UserGroup.prototype, 'save');
        mongoose.Promise = Promise;
        beforeEach(function (done) {
            saveStub.reset();
            return done();
        });
        after(function (done) {
            saveStub.restore();
            return done();
        });
        it('creates an object without error', async function () {
            const correctDetailsIn   = {
                name: 'stark',
                foo: 'bar',
                bar: 'baz',
                users: [{
                    email: 'eddard@stark.com',
                    firstName: 'eddard',
                    surname: 'stark'
                }]
            };
            const persistableDetails = {
                name: 'stark',
                users: [{
                    email: 'eddard@stark.com',
                    firstName: 'eddard',
                    surname: 'stark'
                }]
            };
            const expectedDetailsOut = {
                _id: 'someidhere',
                name: 'stark',
                users: [{
                    email: 'eddard@stark.com',
                    firstName: 'eddard',
                    surname: 'stark'
                }]
            };
            saveStub.resolves(expectedDetailsOut);
            const res = await userGroupService.createGroup(correctDetailsIn);
            expect(res).to.equal(expectedDetailsOut);
            //I tried the four variations below.
            expect(saveStub).to.be.calledWithMatch(persistableDetails);
            //expect(saveStub).to.be.calledWith(persistableDetails);
            //sinon.assert.calledWithMatch(saveStub, persistableDetails)
            //sinon.assert.calledWith(saveStub, persistableDetails)
        })
    })

我尝试过的四种方法都失败了,但有一些变化:

AssertionError: expected save to have been called with arguments matching {
  name: "stark",
  users: [{ email: "eddard@stark.com", firstName: "eddard", surname: "stark" }]
}
{
  name: "stark",
  users: [{ email: "eddard@stark.com", firstName: "eddard", surname: "stark" }]
}

我觉得我错过了一些简单的工作。

修改

所以这很简单(而且非常明显,当然,我错过了它)Model.save()是一个实例方法,因此它在没有参数的情况下被调用。它必须与Sinon断言有关,它显示期望两次,而不是期望和现实。

我真正需要做的是弄清楚如何对Model构造函数进行存根/间谍,以确保使用正确的参数调用它。如果有人知道如何做到这一点,我可以尽力帮助。

0 个答案:

没有答案