如何监视node-jasmine中的类方法?

时间:2015-05-31 17:11:35

标签: javascript node.js class-method spyon

我有一个模块用户 - 就像这样:

module.exports = User = (function() {

  function User(params) {
  this.id               = params.id;
  this.first_name       = params.first_name || '';
  this.last_name        = params.last_name  || '';
  this.username         = params.username;
  this.email            = params.email;
  this.password         = params.password;
  };

  User.findByUsername = function(username, callback) {
    if (!_.isEmpty(username)) {
      var opts = {table: TABLE, where: {sql:  "username='"+username+"'"}};
      QueryDispatcher.findWhere(opts, function(err, result) {
        if(!_.isEmpty(err)) { return callback(err, null)}
          callback(null, result.rows[0]);
      });
    };
  };

return User;
};

使用类方法的函数:

module.exports = AuthStrategies = (function() {

  AuthStrategies.localStrategy = function(username, password, done) {
    async.waterfall([
      function(callback) {
        User.findByUsername(username, function(err, user){
          if (err) { callback(err) };
          if (_.isEmpty(user)) {
            callback(null, false, { message: 'Incorrect username.' });
          };
          callback(null, user, null)
        });
      },

      function(user, opts, callback) {
        "do something here and call the next callback"
      }]

      , function(err, user, opts) {
        if(err) { return done(err)}
        if(!user) { return done(null, false, opts.message)}

        done(null, user)
      });
  };

  return AuthStrategies;
})();

我有我的茉莉花测试 -

var Auth = require('path to AuthStrategies module')

describe('Auth', function() {

  describe('#AuthStrategies.localStrategy', function() {
    describe('when user creds are valid', function() {
      var test_user;
      beforeEach(function(){
        test_user = new User({
          username: 'test996'
          , password: 'password123'
          , email: 'testemamil@email.com'
          , first_name: ''
          , last_name: ''
        });
        spyOn(User, "findByUsername").and.callFake(function(usrename, cb) {
          cb(null, test_user);
        });
      });

      it('returns user object', function(done) {
        Auth.localStrategy('test996', 'password123', function(err, user, opts) {
          expect(err).toEqual(null);
          expect(user).toEqual(test_user);
          done()
        })
      });
    });
  });
});

基本上我想要删除User Class方法findByUsername并使用我自己的结果伪造回调,即nul错误和用户(就好像查找成功)。

我在很多"班级"我的应用程序中的方法,并没有这个问题。这让我感到困惑。该错误仅在我向间谍添加.and.callThrough.and.callFake时显示...当我删除此测试的时刻只是超时...这是间谍有效并且不会调用async瀑布继续进行回调。

我得到的错误是 -

error message

1 个答案:

答案 0 :(得分:0)

所以我想出来了 -

无论如何,上面看到的错误都会发生。我之所以得到上述"额外信息"这让我一扫而光 - 因为我是在分开运行测试。

./node_modules/.bin/jasmine ./tests_to_run_spec.js

正常情况会发生 - 我会因缺少回调而导致超时失败。就像我上面的情况一样,我并没有在伪造的函数中调用回调函数。

实际上更有趣的是 - 从我的PATH运行jasmine-node并不喜欢在这个特殊的间谍上调用.and....。真的不知道。但是我如何让spyOn(User, 'findByUsername').and.callFake ......工作