我正在测试骨干视图,它具有以下功能:
attachSelect: function(id, route) {
console.log(id);
console.log(route);
this.$(id).select2({
ajax: {
url: route,
dataType: 'json',
results: function(data) {
var results = _.map(data, function(item) {
return {
id: item.id,
text: item.title
};
});
return {
results: results
};
},
cache: true
}
});
}
我需要重写(模拟)这个功能,看起来像:
attachSelect: function(id, route) {
console.log(id);
console.log(route);
}
怎么做?
答案 0 :(得分:6)
模拟函数的最简单方法是在运行时替换属性。
您可以提供自己的监控功能(通常称为间谍),虽然这不是最优雅的。那看起来像是:
var called = false;
var testee = new ViewUnderTest();
var originalAttach = testee.attachSelect; // cache a reference to the original
testee.attachSelect = function () {
called = true;
var args = [].concat(arguments); // get an array of arguments
return originalAttach.apply(testee, args);
};
// Perform your test
expect(called).to.be.true;
如果您有chai之类的测试断言库,则可以使用spies plugin并将其缩减为:
var testee = new ViewUnderTest();
var spy = chai.spy(testee.attachSelect);
testee.attachSelect = spy;
// Perform your test
expect(spy).to.have.been.called();
使用间谍库将提供一些有用的功能,例如监视调用次数及其参数以验证低级别行为。如果您正在使用Chai或Jasmine,我强烈建议您利用相应的间谍支持。