Chai / Sinon:如何监视函数返回的promise的返回值?

时间:2017-04-30 06:29:58

标签: javascript unit-testing integration-testing sinon chai

我正在为onAfterDelete设置单元+集成测试:

Assessment.onAfterDelete = async () => {
  ...

  // Log assessment deleted
  await Activity.create({
    assessmentId,
    activityTypeId: ACTIVITY_TYPE.ASSESSMENT_DELETED,
  }, options);

  ...
};

虽然我知道如何测试Activity.create被调用,但我真的想测试Activity是否已成功创建。

如果它不是异步的,那么我将按如下方式使用Sinon.spy:

it('logs the assessment deleted activity', async () => {
  sinon.spy(Activity, 'create');
  await Assessment.onAfterDelete(...);
  expect(Activity.create).returned({
    activityTypeId: ACTIVITY_TYPE.ASSESSMENT_DELETED,
    assessmentId: standardAssessmentData.id,
  });
  Activity.create.restore();
});

当然,这不起作用,因为Activity.create会返回Promise。

用一段时间谷歌搜索Chai和Sinon的各种口味后,我还没有找到这个用例的解决方案。我该如何测试这个返回值?

2 个答案:

答案 0 :(得分:0)

虽然我的问题的答案已经被robertklep所覆盖,但我实际上最终在内部方法Activity.create中将调用包裹到Assessment.logDeleteActivity并对其进行测试。

答案 1 :(得分:0)

您可以使用chai-as-promised

const chai           = require('chai');
const chaiAsPromised = require('chai-as-promised');
chai.use(chaiAsPromised);

it('logs the assessment deleted activity', async () => {
  sinon.spy(Activity, 'create');
  await Assessment.onAfterDelete();

  // Make sure `Activity.create()` got called.
  expect(Activity.create.called).to.be.true;

  // Check the resolved value.
  await expect(Activity.create.firstCall.returnValue).to.eventually.equal({
    activityTypeId : ACTIVITY_TYPE.ASSESSMENT_DELETED,
    assessmentId   : standardAssessmentData.id,
  });

  // Restore the original.
  Activity.create.restore();
});
相关问题