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