0

モジュール User があります-次のように:

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 エラーとユーザー (検索が成功したかのように) でコールバックを偽造したいと考えています。

アプリの多くの「クラス」メソッドにスパイがあり、この問題はありません。これは私を少し困惑させています。エラーは、スパイに追加.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 に答える