Sinon存根withArgs忽略了额外的参数

时间:2018-10-03 14:32:50

标签: testing sinon

我的生产代码如下:

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返回值?

2 个答案:

答案 0 :(得分:1)

存根

一种方法是使用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();

答案 1 :(得分:1)

另一种选择,也许您可​​以尝试像这样检查convertToWord的呼叫

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

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

参考:

希望有帮助