[英]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.