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();
});
我正在为 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();
});