3

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

我正在使用 Sinon 存根猫鼬模型的保存方法,并检查是否使用正确的详细信息调用了该存根。

我正在测试的功能:

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()是一个实例方法,所以它是在没有参数的情况下调用的。这一定与诗浓断言有关,它显示了两次期望,而不是期望和现实。

我真正需要做的是弄清楚如何对Model构造函数进行存根/监视,以确保使用正确的参数调用它。如果有人知道该怎么做,我真的可以在帮助下做。

4

0 回答 0