2015-05-31 61 views
0

我有一個模塊的用戶 - 這樣的:如何窺視node-jasmine中的類方法?

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: '[email protected]' 
      , 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() 
     }) 
     }); 
    }); 
    }); 
}); 

基本上我想將用戶類方法findByUsername剔除,並用我自己的結果僞造回調,即nul錯誤和用戶(就好像查找成功)。

我有許多「類」方法在我的應用程序間諜,並沒有這個問題。這讓我有點莫名其妙。該錯誤只顯示當我添加.and.callThrough.and.callFake間諜..當我刪除這個測試只是超時......這是有道理的,因爲間諜的作品,並沒有呼籲異步瀑布繼續所需的回調。

我得到的錯誤是 -

error message

回答

0

所以我想通了 -

您在上面看到的錯誤發生反正。我得到上述「額外信息」的原因是因爲我正在單獨運行測試。

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

會正常發生什麼 - 是我會得到一個超時失敗是由於缺少回調。就像我在上面的情況一樣,我並沒有在假冒的功能中調用回調函數。

實際上更有趣的是 - 從我的PATH運行jasmine-node並不喜歡.and....被這個特殊的間諜調用。真的不知道。但是我怎麼得到spyOn(User, 'findByUsername').and.callFake ...去工作