簡體   English   中英

動態獲取對象的間諜方法

[英]Spy method from dynamically obtained object

我使用貓鼬,並且具有登錄功能,該功能試圖找到用戶然后驗證其密碼(在此我將不描述此功能的所有邏輯,而僅主要部分說明您的問題)。

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

我已經定義了一個包含有效密碼方法的用戶模型,並且一切正常,但是我很難監視有效密碼方法。

我使用Jasmine進行測試,並嘗試通過以下方式進行操作:

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

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

當然,我叫登錄功能。 當我以這種方式測試findOne方法時,它可以正常工作,但是它更簡單,因為我從User構造函數中調用了方法:

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

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

我認為我的問題與不同的實例有關,因為findOne方法為我解決了一個新的用戶對象,而在測試中我創建了第二個用戶對象,這是絕對不同的對象,但是我不確定這個猜想。 你能告訴我如何修理嗎?

好的,我解決了這個問題。

1)我在這里找到了解決問題的方法

2)我注意到findOne方法返回promise,然后執行異步任務,因此我必須在開始測試之前使用“ done”功能進行檢查。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM