我需要确保调用下面显示的UserMock
- 类中的某个方法。我已创建此模拟版本以注入另一个模块以防止测试期间的默认行为。
我已经在使用sinon.js
,那么如何访问isValid()
等方法并将其替换为间谍/存根?是否可以在不实例化类的情况下执行此操作?
var UserMock = (function() {
var User;
User = function() {};
User.prototype.isValid = function() {};
return User;
})();
谢谢
答案 0 :(得分:3)
var UserMock = (function() {
var User;
User = function() {};
User.prototype.isValid = function() {};
return User;
})();
只需通过prototype
:
(function(_old) {
UserMock.prototype.isValid = function() {
// my spy stuff
return _old.apply(this, arguments); // Make sure to call the old method without anyone noticing
}
})(UserMock.prototype.isValid);
<强>解释强>
(function(_old) {
和
})(UserMock.prototype.isValid);
对方法isValue
引用变量_old
。关闭是这样的,所以我们不会使用变量来填充父范围。
UserMock.prototype.isValid = function() {
重新声明原型方法
return _old.apply(this, arguments); // Make sure to call the old method without anyone noticing
调用旧方法并从中返回结果。
使用apply允许放入正确的范围(this
),并将所有参数传递给函数
例如。如果我们做一个简单的功能并应用它。
function a(a, b, c) {
console.log(this, a, b, c);
}
//a.apply(scope, args[]);
a.apply({a: 1}, [1, 2, 3]);
a(); // {a: 1}, 1, 2, 3