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

本质上,我想删除用户类方法findByUsername并用我自己的结果伪造回调,即 nul 错误和用户(好像找到成功一样)。

我在我的应用程序中对许多“类”方法进行了 Spy,并且没有这个问题。这让我有点莫名其妙。该错误仅在我添加.and.callThrough或添加.and.callFake到间谍时显示。当我删除它的那一刻,测试只是超时...这是有道理的,因为间谍工作并且不调用异步瀑布继续所需的回调。

我得到的错误是 -

错误信息

4

1 回答 1

0

所以我想通了——

您在上面看到的错误无论如何都会发生。我得到上述“额外信息”的原因让我感到厌烦——因为我是单独运行测试的。

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

正常会发生什么 - 由于缺少回调,我会超时失败。就像我上面的例子一样,我没有在我提供的伪造函数中调用回调[正确使用。

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

于 2015-05-31T19:34:18.907 回答