Chai/Sinon:如何监视函数 return 承诺的 return 值?

Chai/Sinon: How to spy on the return value of a promise returned by a function?

我正在为 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 return 是一个承诺。

在使用 promises 谷歌搜索了 Chai 和 Sinon 的各种风格后,我还没有找到这个用例的解决方案。我如何测试这个 return 值?

虽然 robertklep 已经回答了我的问题,但我实际上最终将对 Activity.create 的调用包装在一个内部方法 Assessment.logDeleteActivity 中并对其进行了测试。

您可以使用 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();
});