2015-05-31 2 views
0

У меня есть пользовательский модуль - как это:Как шпионить за методом класса в узел-жасмин?

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() 
     }) 
     }); 
    }); 
    }); 
}); 

По существу я хочу вычеркните метод User Class findByUsername и подделайте обратный вызов с моими собственными результатами, т.е. nul error и пользователем (как если бы поиск был успешно).

У меня есть шпион по многим методам «класса» в моем приложении, и у меня нет этой проблемы. Меня это немного озадачивает. Ошибка отображается только тогда, когда я добавляю .and.callThrough или .and.callFake к шпиону. В тот момент, когда я удаляю этот тест, просто время ... что имеет смысл, так как шпион работает и не вызывает обратный вызов, необходимый для продолжения асинхронного водопада.

Ошибка я получаю -

error message

ответ

0

Так я понял это -

Ошибка вы видите выше, происходит в любом случае. Причина, по которой я получал вышеупомянутую «дополнительную информацию», которая меня отбрасывала, была потому, что я тестировал отдельно.

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

Что бы нормально случиться - это я хотел бы получить отказ тайм-аут из-за отсутствующего обратного вызова. как в моем случае выше, я не вызывал обратный вызов в фальшивой функции, которую я поддерживал правильно.

На самом деле еще интереснее - запуск жасминового узла из моего PATH не нравится, когда .and.... вызывается именно этим шпионом. На самом деле понятия не имею. но что я получил spyOn(User, 'findByUsername').and.callFake ... для работы

Смежные вопросы