【问题标题】:Creating test objects in Sinon.js在 Sinon.js 中创建测试对象
【发布时间】:2014-01-26 00:42:15
【问题描述】:
我正在尝试使用 Sinon.js 测试代码,但我不熟悉它的行为方式。
我希望我可以创建一个“假”对象,用 sinon 包装它并将它传递给我正在测试的任何东西,并让它做它的事情。但是,似乎每次我尝试包装一个 sinon 对象时,该函数都不存在:
var event_api = {
startTime: function() {
return '123';
}
}
var stub = sinon.stub(event_api);
console.log(stub.startTime()) // returns undefined
var mock = sinon.mock(event_api);
console.log(mock.startTime()) // returns undefined
我错过了什么?
【问题讨论】:
标签:
javascript
testing
sinon
【解决方案1】:
这取决于你想做什么:
如果您对调用没有任何期望,那么您应该使用存根,例如 startTime() 只需返回一个值。
var event_api = {
startTime: sinon.stub().returns('123')
}
console.log(event_api.startTime());
但如果你想要为调用设置一些断言,那么你应该使用模拟。
var event_api = {
startTime: function() {
return '123';
}
}
//code to test
function getStartTime(e) {
return e.startTime();
}
var mock = sinon.mock(event_api);
mock.expects("startTime").once();
getStartTime(event_api);
mock.verify();
希望这会有所帮助。
【解决方案2】:
该功能确实存在,但它没有任何功能,因为它已被存根。
如果你想在控制台中记录函数本身,你必须执行:
console.log(stub.startTime) //logs the function itself
代替:
console.log(stub.startTime()) //logs the result of the function, which is undefined
但是,如上所述,存根对象的所有方法都已“清空”了它们的功能。如果你想让一个存根对象的方法返回一个值,你可以这样做:
var stub = sinon.stub(event_api);
stub.startTime.returns(123);
console.log(stub.startTime) //log the function
console.log(stub.startTime()) //log the result of function, that is now 123