0

我需要确保UserMock调用了下面显示的类中的某个方法。我创建了这个模拟版本来注入另一个模块,以防止测试期间的默认行为。

我已经在使用sinon.js,那么如何访问诸如isValid()spy/stub 之类的方法并将其替换?是否可以在不实例化类的情况下做到这一点?

var UserMock = (function() {
  var User;
  User = function() {};
  User.prototype.isValid = function() {};
  return User;
})();

谢谢

4

1 回答 1

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 

调用旧方法并从中返回结果。

this使用 apply 可以将所有参数放入正确的范围 ( ) 中,
例如。如果我们制作一个简单的函数并应用它。

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
于 2012-11-14T16:53:10.407 回答