2017-09-02 7 views
0

私はmongooseを使用しています。ユーザーを見つけてパスワードを有効にしようとするログイン機能があります(この機能のすべてのロジックはここでは説明しませんが、 。動的に取得されたオブジェクトからのスパイメソッド

function login(req, res) { 
    ... 
    User.findOne(...) 
     .then((user) => { 
      user.validPassword(...); 
      ... 
     }); 
} 

私はvalidPasswordメソッドが含まれているUserモデルを定義して、すべてが正常に動作が、私はvalidPassword方法をスパイする問題があります。

私は私のテストにジャスミンを使用して、私はこの方法でこれを実行しようとしました:

const user = new User(...); 
spyOn(user, 'validPassword').and.callThrough(); 

expect(user.validPassword).toHaveBeenCalled(); // was never called :(

そしてもちろん、私は、ログイン機能と呼ばれます。私はこのようにfindOneメソッドをテストするとき、それが正常に動作しますが、私は、ユーザーのコンストラクタからメソッドを呼び出すので、それは簡単です:

spyOn(User, 'findOne').and.callThrough(); 

expect(User.findOne).toHaveBeenCalled(); // this works fine! 

私はfindOne方法は、新しいユーザーオブジェクトを解決するために私の問題は、異なるインスタンスに関連していると思います私とテストで私は2番目のものを作ります、絶対に違うものは何ですか、私はこの推測については分かりません。 修理方法を教えてもらえますか?

答えて

0

Okこれを修正しました。

1)私はfindOneメソッドが返す約束していることに気づいた後、私は非同期タスクを実行する私の問題here

2)の解決策を見つけたので、私は、開始試験の前に「行って」関数でそれをチェックしなければなりませんでした。ジャスミンで

function login(req, res) { 
    ... 
    return User.findOne(...) 
     .then((user) => { 
      user.validPassword(...); 
      ... 
     }); 
} 

beforeAll((done) => { 
    spyOn(User.prototype, 'validPassword').and.callThrough(); 

    login(...).then(() => done()); 
} 

it('calls validPassword',() => { 
    expect(User.prototype.validPassword).toHaveBeenCalled(); // works :) 
}); 
関連する問題