Sinon stub withArgs 忽略额外参数

Sinon stub withArgs ignores extra arguments

我的生产代码如下所示:

exports.convertWord = number => { /* some logic here */ }
exports.methodUnderTest = () => {
    return exports.convertWord(1);
}

测试代码:

const mockConvertToWord = sinon.stub();
mockConvertToWord.withArgs(1).returns('one');
fileUnderTest.convertWord = mockConvertToWord;

const result = fileUnderTest.methodUnderTest();

expect(result).toBeEqual('one');

上面的测试是绿色的。如果我将产品代码更改为此,我希望我的测试会中断:

exports.convertWord = number => { /* some logic here */ }
exports.methodUnderTest = () => {
    return exports.convertWord(1, 'another arg');
}

但事实并非如此。即使我传递了我在 withArgs 方法中没有指出的额外参数,Sinon 也能正常工作。仅当使用确切数量的参数调用方法时,我如何才能告诉 sinon return 值?

存根

一种方法是使用 stub.callsFake(fakeFunction):

mockConvertToWord.callsFake((...args) => args.length === 1 && args[0] === 1 ? 'one' : undefined);

使用 stub 的另一种方法是使用 sinon.assert 来确保使用 @deerawan 指出的预期参数调用 stub


模拟

另一种方法是使用 mock:

const mock = sinon.mock(fileUnderTest);
mock.expects('convertWord').withExactArgs(1).returns("one");

const result = fileUnderTest.methodUnderTest();  

expect(result).toBeEqual('one');
mock.verify();

另一种选择,也许您可​​以尝试检查 convertToWord 的调用,例如

...
expect(result).toBeEqual('one');

// check the function 
sinon.assert.alwaysCalledWithExactly(mockConvertToWord, '1');

参考:

希望对您有所帮助