Javascript 笑话模拟不可命名拾取错误抛出?
我有一些调用api的代码。我正在测试try-catch中嵌套的功能,并检查在抛出带有特定值的错误时是否发生了正确的行为Javascript 笑话模拟不可命名拾取错误抛出?,javascript,unit-testing,mocking,jestjs,Javascript,Unit Testing,Mocking,Jestjs,我有一些调用api的代码。我正在测试try-catch中嵌套的功能,并检查在抛出带有特定值的错误时是否发生了正确的行为 async function createDeployment(namespace, config, name) { try { await k8sDeploymentApi.createNamespacedDeployment(namespace, config, true); console.log('Successful deployment');
async function createDeployment(namespace, config, name) {
try {
await k8sDeploymentApi.createNamespacedDeployment(namespace, config, true);
console.log('Successful deployment');
return Promise.resolve(true);
} catch (e) {
console.log(JSON.stringify(e));
if (e.response.statusCode === HTTP_CONFLICT) {
try {
await k8sDeploymentApi.replaceNamespacedDeployment(name, namespace, config, true);
console.log('Successfully replaced deployment');
return Promise.resolve(true);
} catch (error) {
return Promise.reject(error);
}
}
return Promise.reject(e);
}
}
我在这里模拟api调用节点模块
var mockListNamespacedIngress;
var mockCreateNamespacedDeployment;
var mockReplaceNamespacedDeployment;
jest.mock('@kubernetes/client-node', () => {
mockListNamespacedIngress = jest.fn();
mockCreateNamespacedDeployment = jest.fn();
mockReplaceNamespacedDeployment = jest.fn();
return {
KubeConfig: jest.fn().mockImplementation(() => ({
loadFromCluster: jest.fn(),
loadFromDefault: jest.fn(),
makeApiClient: () => ({
listNamespacedIngress: mockListNamespacedIngress,
createNamespacedDeployment: mockCreateNamespacedDeployment,
replaceNamespacedDeployment: mockReplaceNamespacedDeployment,
}),
})),
};
});
在这里运行测试
it.only('Should return a log of success if replaced deployment resolves', async () => {
mockCreateNamespacedDeployment.mockRejectedValueOnce(() =>
Promise.reject(new Error({ response: { statusCode: 409 } })),
);
mockReplaceNamespacedDeployment.mockResolvedValueOnce(true);
// When
await expect(createDeployment()).resolves.toEqual(true);
});
然而,在console.log(JSON.stringify(e))上,我只返回了未定义的内容。因此,它看起来确实抛出了错误,但没有从catch中给出错误对象。这是我的全部记录
● Kubernetes deployment script tests › Kubernetes Calls › Should return a log of success if replaced deployment resolves
expect(received).resolves.toEqual()
Received promise rejected instead of resolved
Rejected to value: [TypeError: Cannot read property 'statusCode' of undefined]
143 |
144 | // When
> 145 | await expect(createDeployment()).resolves.toEqual(true);
| ^
146 | });
147 | });
148 |
at expect (node_modules/expect/build/index.js:134:15)
at Object.it.only (src/__tests__/index.test.js:145:13)
console.log
Successful deployment
at createDeployment (src/index.js:73:13)
console.log
undefined
at createDeployment (src/index.js:76:13)
您可以模拟一个异步函数抛出这样的错误
mockCreateNamespacedDeployment.mockRejectedValueOnce(new Error({ response: { statusCode: 409 } });
然后你可以期待
await expect(createDeployment()).rejects.toThrow();
顺便说一句,在
async
函数中,您可以替换所有
- Promise.resolve(xxx)
+ return xxx
// and
- Promise.reject(xxx)
+ throw xxx
当我这样做时,我仍然会得到console.log的'successful deployment',在catch(e)中创建的'e'变量中没有任何值,这与我正常运行代码时的情况相反,当createNamespacedDeployment出现错误时,它会以409 http状态代码进入catch。