使用摩卡和柴AsPromised测试异步功能时断言错误



所以我正在尝试测试我的异步函数在存根s3GetObject = Promise.promisify(s3.getObject.bind(s3))被拒绝时是否抛出错误blah但是我得到我的函数不是异步的,它不会抛出错误。

以下是我的main.js文件,其中包含tests.js

const Promise = require('bluebird');
const AWS = require('aws-sdk');
const s3 = new AWS.S3({
});
const s3GetObject = Promise.promisify(s3.getObject.bind(s3));
async function getS3File(){
try {
const contentType = await s3GetObject(s3Params);
console.log('CONTENT:', contentType);
return contentType;
} catch (err) {
console.log(err);
throw new Error(err);
}
};

测试:

/* eslint-env mocha */
const rewire = require('rewire');
const chai = require('chai');
const sinonChai = require('sinon-chai');
const sinon = require('sinon');
const chaiAsPromised = require('chai-as-promised');
chai.should();
chai.use(sinonChai);
chai.use(chaiAsPromised);
describe('Main', () => {
describe('getFileFromS3', () => {
let sut, getS3File, callS3Stub;
beforeEach(() => {
sut = rewire('../../main');
getS3File = sut.__get__('getS3File');
sinon.spy(console, 'log');
});
afterEach(() => {
console.log.restore();
});
it('should be a function', () => {
getS3File.should.be.a('AsyncFunction');
});
describe('with error', () => {
beforeEach(() => {
callS3Stub = sinon.stub().rejects('blah');
sut.__set__('s3GetObject', callS3Stub);
getS3File = sut.__get__('getS3File');
});
it('should error with blah', async () => {
await getS3File.should.throw();
//await console.log.should.be.calledWith('blah');
});
});
});
});

我得到的错误是: 1( 主要

getFileFromS3 应该是一个函数: 断言错误:预期 [函数: getS3File] 是异步函数 at Context.it (test\unit\main.spec.js:28:27(

2( 主要

getFileFromS3 有错误 应该错误与 blah: 断言错误: 预期 [函数: getS3File] 抛出错误

未处理的承诺拒绝警告:错误:等等 未处理的承诺拒绝警告:未处理的承诺拒绝。

此错误起源于在没有 catch 块的异步函数内部抛出,或者拒绝未使用.catch(). (rejection id: 228)处理的承诺

正如这个答案中所解释的,一个函数是否async并不重要,只要它返回一个承诺。柴依靠type-detect来检测类型,并检测async功能作为function

它应该是:

getS3File.should.be.a('function');

async函数是承诺的语法糖,它们不会抛出错误,而是返回被拒绝的承诺。

它应该是:

getS3File().should.be.rejectedWith(Error); 

最新更新