2017-09-02 28 views
0

我使用貓鼬和我有登錄功能,試圖找到用戶,然後驗證他的密碼(我不會在這裏描述此功能的所有邏輯,但只有主要部分向您展示我的問題) 。從動態獲取對象的間諜方法

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

我已經定義了一個包含validPassword方法的用戶模型和所有工作正常,但我有麻煩窺探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方法解決新的用戶對象我的問題是關係到不同的情況下,對於我和測試中我創建了第二個,什麼是完全不同的對象,但我不確定這個猜想。 你能告訴我如何修復?

回答

0

好的我解決了這個問題。

1),我發現我的問題here

2)的解決方案,我注意到,findOne方法返回的承諾,然後我做異步任務,所以我有開始測試之前,「完成」功能來檢查它。

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