我正在尝试测试以下功能
foreach (InventoryReportBodyElement Record in ddrMessage.DdrInstances)
{
//InventoryReportBodyElement OSClass = ddrMessage.DdrInstances.Where(m => m.Class == "CCM_DiscoveryData");
Debug.WriteLine(Record.ToString());
}
笑话: //在beforeEach
中 getVal(process) {
test.on('data', async data => {
try {
for (const val of data) {
await process(val);
console.log('processed')
}} catch (e) {}
});
test.on('error', err => {
console.log('error', err)
});
}
process(payload) {
return new Promise(resolve=>{.....})
};
我希望mockData =[an array containing 10 values]
onSpy = jest
.fn()
.mockImplementationOnce(async (data, callback) => {
callback(mockData);
})
.mockImplementationOnce((error, callback) => {
callback(mockErr);
});
it('should trigger callback once per message', async () => {
await xyz.getVal(process);
await expect(process).toHaveBeenCalledTimes(10);
});
被调用10次,因为发送了10次数据。但是,在我断言时只调用了2次,而在我将console.log放入函数本身并运行测试时,它被调用了10次。
我不确定这是怎么回事。感谢任何帮助。
答案 0 :(得分:0)
问题在于,在await
上调用xyz.getVal
实际上没有任何作用,因为getVal
是一个同步函数,仅设置事件侦听器...
...因此,在expect
运行并失败时,异步事件尚未完成处理。
您似乎已经监视test.on
。
与其模拟实现,不如使用它来获取回调函数。
然后您可以直接调用和await
回调函数:
// in beforeEach
mockData = [an array containing 10 values]
onSpy = jest.fn();
it('should trigger callback once per message', async () => {
xyz.getVal(process);
const callback = onSpy.mock.calls[0][1]; // <= get the callback (second argument of the first call to test.on)
await callback(mockData); // <= call and await the callback directly
expect(process).toHaveBeenCalledTimes(10); // Success!
});