簡體   English   中英

開玩笑測試回調承諾

[英]Jest test callback promise

我想測試以下storeCache函數。 我要測試的關鍵部分是Meteor.call(...)的回調函數。

我想模擬Meteor.call(...)但它由Promise包裝,並且回調本身也依賴於包裝的Promise。

 export async function storeCache(cache) {
    // do something
    return new Promise((resolve, reject) => {
        Meteor.call("transferCache", cache, async (error, result) => {
        if (error) {
            reject(error);
        } else {
            try {
                const result = await persistCache();
                resolve(result)
            } catch (e) {
                reject(e);
            }
        }
    });
});

}

通過Jest測試定義的回調函數的最佳方法是什么? 還是有更好的方法來構造代碼以使其更易於測試?

它應該像

// in your imports
import { Meteor } from 'meteor/meteor'
jest.mock('meteor/meteor', () => {
  return {
    Meteor: {
      call: jest.fn()
    }
  }
})

//in your test case
Meteor.call.mockImplementation((eventName, cache, callback) => {
// your assertions
// you can call the callback here
// you probably want to mock persistCache too
})

所以這是我的解決方案: Meteor.call在另一個名為helper.transferData()函數中。 這消除了回調的必要。 我可以將邏輯直接放在storeCache()和模擬helper.transferData()

export async function transferData(cache) {
   return new Promise((resolve, reject) => {
      Meteor.call("transferCache", cache, async (error, result) => {
         if (error) {
            reject(error);
         } else {
            resolve(result);
         }
      });
   });
}


export async function storeCache(cache) {
   // do something
   try{
      // call meteor method
      const transferResult = await helper.transferData(cache);
      // callback logic
      const result = await persistCache();
      // return Promise for compability reasons
      return Promise.Resolve(result);
   } catch (e) {
      return Promise.Reject(result);
   }

暫無
暫無

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

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