Невозможно протестировать асинхронный метод, который должен выдать - PullRequest
0 голосов
/ 21 мая 2018

У меня есть тестовый пример, который выглядит следующим образом:

it("should throw when the template file does not exist", async (): Promise<void> => {
    await expect(new UpdateReadmeCommandlet().invoke()).to.be.rejectedWith(Error);
});

И соответствующий метод invoke следующий:

public async invoke(): Promise<void> {
    fs.readFile(this.templatePath, (outerError: NodeJS.ErrnoException, data: Buffer): void => {
        if (outerError !== null) {
            throw new Error(`FileNotFoundException: Cannot find file \`${this.templatePath}'.`);
        }
    });
}

Этот тест настроен так, чтобы эта ошибкаброшенПри запуске mocha я получаю некоторые действительно неловкие сообщения об ошибках, и все происходит повсюду, что, скорее всего, связано с асинхронными вызовами.Я получаю сообщение об ошибке: AssertionError: expected promise to be rejected with 'Error' but it was fulfilled with undefined.

Мой тест написан на основе этого ответа .Удивительно, но когда я копирую метод fails, он работает так, как описано в посте.Обмен директивой throw с моим вызовом invoke вызывает проблемы.Поэтому я предполагаю, что мой invoke метод должен работать по-другому.

Я до сих пор не могу понять, что на самом деле не так, и как я могу переписать свой тест st, не мешает другим тестам, и это проверяет мое утверждение правильно.

1 Ответ

0 голосов
/ 21 мая 2018

Бросок в обратном вызове, переданном fs.readFile , не будет отклонять обещание, возвращаемое public async invoke(): Promise<void> {

Исправить

Обтекание fs.readFile будет асинхронно осознает и использует этот каскад отказа от обещания.

public async invoke(): Promise<void> {
    return new Promise<void>((res, rej) => {
    fs.readFile(this.templatePath, (outerError: NodeJS.ErrnoException, data: Buffer): void => {
        if (outerError !== null) {
            rej(new Error(`FileNotFoundException: Cannot find file \`${this.templatePath}'.`));
        }
    });

    })
}
...