我正在为我的模块编写单元测试,并使用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")
返回的期望,并在其上应用withArgs
和returns
。两者都无济于事。
我很确定我以不应该的方式使用mock()
,但我应该如何离开这里?
答案 0 :(得分:0)
结果我正在测试的模块实际调用getConfig
3次:一次使用A
,一次使用B
,然后再使用A
。
显然,Sinon会跟踪所有期望/通话的顺序,这也是使用atLeast(1)
代替once()
时测试失败的原因。当我现在看它时有道理,但这些案例并没有在Sinon文档中进行过广泛的记录(在我自己的辩护中)。