摩卡:如何断言诺言?

时间:2019-01-17 06:50:57

标签: javascript promise async-await mocha

我试图让Mocha显示错误并在我的Node代码上声明一个被拒绝的诺言-...而不是显示UnhandledPromiseRejectionWarning导致异常的原因,该异常导致我的异步函数被拒绝。

我已经搜索并尝试了许多建议来处理此警告,并承诺在Mocha中拒绝,但没有一个对我有用。对于许多人来说,这似乎是一个反复出现的话题,并且是一个非常令人困惑的话题。

我正在尝试通过以下方式做到这一点:

  • 使用lambda函数

  • 不使用done

  • 使用简单的断言(我不喜欢expectshould

  • 通过try / catch处理错误(我不喜欢链接的.then.catch;如果使用.then(res,err),则更不喜欢它)

类似的东西:

it('should give an error', 
  async ()=> {
    try{
      await generateException()
      assert(true)
    } catch(err) {
      console.err(err)
      assert ??? // how to 'assert' a promise rejection?
    }
  }
)

如果不可避免地要使用我不喜欢的任何东西,那很好。但是,我想要什么更接近的解决方案呢?

此外,我不明白为什么拒绝的承诺不会像我期望的那样被捕获在try / catch中,因为这正是使用await(使异步代码像他们是同步的。

2 个答案:

答案 0 :(得分:0)

这对我有用。例如,使用chai进行断言。

const chai = require('chai');
const expect = chai.expect;

describe('test', function () {

  function generateException() {
    throw new Error('test error');
  }


  it('should give an error', async ()=> {
    try {
      await generateException();
      expect(true).to.be.false;
    } catch(err) {
      console.log(err.message);
      expect(err.message).to.equal('test error');
    }
  })
})

使用Promise.reject()throw new Error()的方式似乎有所不同。当函数generateException引发错误时,测试工作。 但是,如果它是Promise.reject(),它将永远不会到达catch块。

如果您执行类似let result = await generateException();的操作,则会发现如果geenerateException函数使用Promise拒绝是您期望的错误。

如果您愿意的话,可以将诺言与等待联系起来。

function generateException() {
  return new Promise(reject => {
   return reject(new Error('Promise Rejected');
})

it('should give an error', async ()=> {
  await generateException().catch(error => {
    expect(error.message).to.equal('Promise Rejected');

  })
});

阅读this article on async code的部分内容可能会有所帮助。

答案 1 :(得分:0)

使用 mocha 单元测试

断言节点模块: 这是我的建议:

const assert = require('assert');

const PromiseFail = async (proms) => await assertPromise(proms, false);
const PromiseSucced = async (proms) => await assertPromise(proms);
const assertPromise = async (prom, succed = true) => {
    succed = succed ? true : false;
    try {
        prom = Array.isArray(prom) ? prom : [prom];
        await Promise.all(prom);
        assert.strictEqual(true, succed);
    }
    catch (ex) { assert.notStrictEqual(true, succed, ex); }
}

测试时:

describe('unit test', () => {
 it('test 1', async () => {
        await PromiseSucced(Promise.resolve(1))
        await PromiseSucced([Promise.resolve(2), Promise.resolve(3)])
        const promise4 = new Promise((resolve, reject) => {
            setTimeout(reject, 100, 'foo');
        });
        await PromiseFail(promise4)
    });
})