开玩笑测试回调承诺

时间:2019-02-11 09:28:27

标签: javascript jestjs

我想测试以下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测试定义的回调函数的最佳方法是什么? 还是有更好的方法来构造代码以使其更易于测试?

2 个答案:

答案 0 :(得分:0)

它应该像

一样简单
// 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
})

答案 1 :(得分:0)

这是我的解决方案: 带有承诺的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);
   }