【发布时间】:2022-03-10 00:03:23
【问题描述】:
Jest 向我抛出以下错误消息 --
node:internal/process/promises:245
triggerUncaughtException(err, true /* fromPromise */);
^
[UnhandledPromiseRejection: This error originated either by throwing inside of an
async function without a catch block, or by rejecting a promise which was not handled with .catch().
The promise rejected with the reason "Error: expect(received).rejects.toThrowError()
Received promise resolved instead of rejected
Resolved to value: undefined".] {
code: 'ERR_UNHANDLED_REJECTION'
}
error Command failed with exit code 1.
我很不确定如何继续前进。来自 Jest 的错误消息读起来像是失败了,因为 promise 解决了并且它期望抛出一个错误......但是当抛出一个错误并说它未处理时感到不安?我一定完全理解错了。
这是我的测试--
describe('credentials test', () => {
it('without credentials', async () => {
const provider = new Provider();
provider.configure(testConfig);
const spyon = jest.spyOn(Credentials, 'get').mockImplementation(() => {
return Promise.reject('err');
});
const action = async () => {
await provider.create({
param: val,
});
};
expect(action()).rejects.toThrowError();
spyon.mockRestore();
});
});
以及正在测试的代码 --
public async create(
params: CreateInput
): Promise<CreateOutput> {
const cmd = new Command(params);
const client = this._init();
try {
const credentialsOK = await this._ensureCredentials();
if (!credentialsOK) {
logger.error(NO_CREDS_ERROR_STRING);
throw Error;
}
const output = await client.send(cmd);
return output;
} catch (error) {
logger.error(`error - ${error}`);
}
}
private async _ensureCredentials() {
return await Credentials.get()
.then(credentials => {
if (!credentials) return false;
const cred = Credentials.shear(credentials);
logger.debug('set credentials', cred);
this._config.credentials = cred;
return true;
})
.catch(error => {
logger.warn('ensure credentials error', error);
return false;
});
}
【问题讨论】:
-
你还需要
awaitexpect(action()).rejects.toThrowError(); -
@Bergi 修复了它的一部分。现在我收到此错误 -
expect(received).rejects.toEqual() -- Received promise resolved instead of rejected -- Resolved to value: undefined -
错误在 async
create函数中被捕获,这意味着返回的承诺已解决。在 catch 块中重新抛出异常以返回被拒绝的承诺。 -
@NomCereal 好吧,那么测试按预期工作,并暴露了代码中的错误:-)
标签: javascript typescript promise jestjs