如何断言一个函数是用多个参数调用的

How to assert that a function is called with multiple arguments

我正在用一个简单的例子学习双重测试:

const Database = require('./Database')

const setupNewUser = (info, callback) => {
    const user = {
        name: info.name,
        nameLowercase: info.name.toLowerCase()
    }

    try {
        Database.save(user, callback)
    } catch (err) {
        callback(err)
    }
}

module.exports = setupNewUser

我有一个接受对象和回调的函数:

const Database = {
    save: (user, callback) => {
        callback(user)
    }
}
module.exports = Database

如何测试 save 是通过对象和回调调用的。以下是我正在尝试的内容:

it('it calls Database.save with a callback', () => {
    const saveSpy = sinon.spy(Database, 'save')
    const arg = {
        name: info.name,
        nameLowercase: info.name.toLowerCase()
    }
    setupNewUser(info, function() {})

    //I'm able to assert that save is called with arg sinon.assert.calledWith(saveSpy, arg)
    sinon.assert.calledWith(saveSpy, arg, function() {}) //This is failing
})

您应该 .stub 您的 API 调用与 .spy。我还建议使用 sinon.sandbox 以便您的测试清理易于管理。了解一下 here

describe('Setup new user', function() {
  const sandbox = sinon.createSandbox();

  afterEach(function() {
    sandbox.restore();
  });

  it('should call Database.save with a callback', function(){
    const databaseSaveStub = sandbox.stub(Database, 'save');

    const user = {
      name: 'Some Name',
      nameLowercase: 'some name'
    };

    const callbackFn = sandbox.spy();

    setupNewUser(user, callbackFn);

    sinon.assert.calledOnce(Database.save);        
    sinon.assert.calledWith(databaseSaveStub, user, callbackFn);
  });
});