[英]Stubbing a mock's method with Sinon.js
我在使用Sinon.js和Buster.js进行测试时,无法使用模拟来替换类的依赖项。
我正在测试依赖于类A的类B。我使用Sinon.js创建类A的模拟对象,并将其传递到类B的实例中。在测试中,我调用对象B的doSomething
方法,然后调用对象A的getData
方法。(尽管getData
方法实际上是在A的原型上,而不是A本身)。
但是,当我运行测试时,我得到了错误:
TypeError: a.getData is not a function
如果我尝试对A的原型的getData
方法存根,则会收到错误消息:
TypeError: Attempted to wrap getData which is already stubbed
该错误发生在我设置mock_A.expects('getData')
。 这是我正在运行的类和测试:
function A(){};
A.prototype = {
"getData" : function(oDataToGet, cb) {
var aData = ['someData'];
cb(aData);
}
}
function B() {
var a;
this.setA = function(oA){
a = oA;
};
this.doSomething = function(oObj){
a.getData({}, function(aData){if(!aData){throw new Error('No data');} oObj.data = aData[0];});
}
}
var oB, assert = buster.referee.assert;
buster.testCase('myTest', {
"setUp" : function()
{
oB = new B();
},
"test_Mock" : function()
{
var mock_A = sinon.mock(new A());
oB.setA(mock_A);
// sinon.stub(A.prototype, 'getData').callsArgWith(1, ['hi']);
mock_A.expects('getData')
.withArgs({})
.once();
var oTestObj = {};
oB.doSomething(oTestObj)
mock_A.verify();
}
});
编辑2016-03-16以添加:一种解决方法是使用存根实例而不是模拟实例,然后将需要检查的方法设置为期望值:
var stubbed_A = sinon.createStubInstance(A);
stubbed_A.getData = sinon.expectation.create('getData')
.withArgs({})
.once();
oB.setA(stubbed_A);
var oTestObj = {};
oB.doSomething(oTestObj);
stubbed_A.getData.verify();
sinonJS与其他产生这种误解的模拟框架(例如Mockito,jMock等)之间存在差异。 在大多数模拟框架中,您可以像创建模拟对象一样创建模拟的依赖项并将其注入到待测试对象(SUT)中:
var mock_A = sinon.mock(new A());
oB.setA(mock_A);
但是,在sinonJS中,您必须注入原始对象,并使用生成的模拟对象为原始对象分配期望。 因此,如果使用以下内容更改前两行,则测试将按预期进行:
var a = new A();
var mock_A = sinon.mock(a);
oB.setA(a);
当我们想控制我们正在测试的对象的依赖项的行为时,存根更为合适。 当我们要确保特定事件将发生在我们测试的对象的依赖关系上(通过期望)时,模拟更合适。 因此,在这种情况下,就像您的第一次尝试一样,模拟对象比存根更合适。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.