简体   繁体   中英

How to spy on a class method in node-jasmine?

I have a module User - like this:

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

The function that uses the class method:

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

I have my jasmine test -

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

Essentially I want to stub out the User Class method findByUsername and fake the callback with my own results ie nul error and a user(as if the find was successfully).

I have Spy on many "class" methods in my app and don't have this problem. This is baffling me a bit. The error only shows when I add .and.callThrough or .and.callFake to the spy.. the moment I remove this the test just times out ...which makes sense as the spy works and doesn't call the callback needed for the async waterfall to continue.

The error I am getting is -

错误信息

So I figured it out -

The error you see above happens anyway. The reason I was getting the above "extra info" which was throwing me off btw - Was because I was running the test separately.

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

What would normal happen - is I would get a timeout failure due to a missing callback. as in my case above I wasn't calling the callback in the faked function I sup[plied properly.

actually even more interestingly - running jasmine-node from my PATH doesn't like the .and.... being called on this particular spy. Really have no idea. but that how I got the spyOn(User, 'findByUsername').and.callFake ... to work

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM