sinon期望的不同参数/返回值

时间:2015-06-01 14:14:06

标签: node.js mocking mocha sinon

我正在为我的模块编写单元测试,并使用SinonJS来验证对其他模块的函数调用的一些期望。首先,我为另一个模块注册了一个模拟器:

var otherModule = {
    getConfig : function () {}
};

mockery.registerMock("otherModule", otherModule);

稍后,我会运行一些测试并(成功)验证一些期望,例如:

var otherModuleMock = sinon.mock(otherModule);
otherModuleMock
    .expects("getConfig")
    .once()
    .withArgs("A")
    .returns(configValuesForA);

// run test

otherModuleMock.verify(); // <- succeeds

然而,当模块使用不同的参数调用getConfig函数两次时,我遇到了一个问题:

otherModuleMock
    .expects("getConfig")
    .once()
    .withArgs("A")
    .returns(configValuesForA);

otherModuleMock
    .expects("getConfig")
    .once()
    .withArgs("B")
    .returns(configValuesForB);

根据我对文档的理解,这应该可行。但是,这会导致以下错误:

ExpectationError: Unexpected call: getConfig(A)
    Expectation met: getConfig(A[, ...]) once
    Expectation met: getConfig(B[, ...]) once

我尝试将once()替换为atLeast(1)或将其完全删除。我还尝试捕获otherModuleMock.expect("getConfig")返回的期望,并在其上应用withArgsreturns。两者都无济于事。

我很确定我以不应该的方式使用mock(),但我应该如何离开这里?

1 个答案:

答案 0 :(得分:0)

结果我正在测试的模块实际调用getConfig 3次:一次使用A,一次使用B,然后再使用A

显然,Sinon会跟踪所有期望/通话的顺序,这也是使用atLeast(1)代替once()时测试失败的原因。当我现在看它时有道理,但这些案例并没有在Sinon文档中进行过广泛的记录(在我自己的辩护中)。