在弄清楚如何进行单元测试时遇到了麻烦,我接近了但不能完全解决。
功能如下:
receiveMessage(callback: Function): any {
this.sqs.receiveMessage(
this.params,
(err: AWSError, data: ReceiveMessageResult) => callback(err, data)
);
}
在测试中,我设置了初始的AWS模拟并在测试中覆盖了它:
jest.mock('aws-sdk', () => {
const SQSMocked = {
receiveMessage: jest.fn().mockReturnThis()
};
return {
SQS: jest.fn(() => SQSMocked),
config: {
update: jest.fn(() => {
return { region: getConfig().region };
})
}
};
});
const sqs = new AWS.SQS({
region: 'us-east-1'
});
然后在此处进行实际测试。我认为在覆盖aws sdk上的receiveMessage时会出错。
it('checks the callback is called', (done) => {
const callback = (err: AWSError, data: ReceiveMessageResult) => {
console.log('called');
done();
};
// how to call the callback on the mock???
sqs.receiveMessage = jest.fn().mockReturnValue(callback);
sqsQueue.receiveMessage(callback);
expect(callback).toHaveBeenCalled();
});
我尝试了许多重写aws sdk的组合,大多数情况下是打字稿错误,但似乎还不太清楚如何模拟函数回调。
有什么想法吗?
答案 0 :(得分:0)
我更改了主要功能并提取了回调接口:
receiveMessage(callback: SqsCallback): void {
this.sqs.receiveMessage(this.params, callback);
}
现在测试仅检查回调是否被调用:
it('should call the callback', (done) => {
const callback: SqsCallback = jest.fn(
(err: AWSError, data: ReceiveMessageResult) => {
done();
}
);
const receiveMessageMock = jest.fn((expectedConfig, sqsCallback) => {
return sqsCallback();
});
// @ts-ignore
sqs.receiveMessage = receiveMessageMock;
sqsQueue.receiveMessage(callback);
});
我无法避免TS类型检查,因此不得不将ts-ignore放在模拟中。
第一次尝试很难理解这个概念,但是几天后就到达了:)