sinon 期望值不同 arguments/return

Different arguments/return values for sinon expectation

我正在为我的模块编写单元测试,并使用 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

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

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

原来我正在测试的模块实际上调用了 getConfig 3 次:一次调用 A,一次调用 B,然后再次调用 A

显然 Sinon 跟踪所有 expectations/calls 的顺序,这就是使用 atLeast(1) 而不是 once() 时测试甚至失败的原因。当我现在看它时是有道理的,但这些案例并没有真正广泛地记录在 Sinon 文档中(在我自己的辩护中)。