当前位置: 首页 > 知识库问答 >
问题:

使用mocha和ChaiaSported测试异步函数时出现断言错误

琴刚豪
2023-03-14

因此,我试图测试当我用 存根拒绝时,异步函数是否抛出错误,但我得到的结果是,我的函数不是异步的,它不会抛出错误。

下面是我的 文件,其中的 js ode=""> :

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应该是一个函数:AssertionError:[function:getS3File]应该是上下文中的asyncfunction.(testUnitMain.spec.js:28:27)

2)主要

getFileFromS3 with error应该错误blah:AssertionError:需要[function:getS3File]才能引发错误

UnhandledPromiserEjectionWarning:错误:blah UnhandledPromiserEjectionWarning:未处理的承诺拒绝。

此错误可能是由于在不带catch块的异步函数内部引发,或者是由于拒绝了未用

共有1个答案

公冶和豫
2023-03-14

正如这个答案中所解释的,函数是否是 并不重要,只要它返回一个承诺。Chai依赖于 来检测类型,并将 函数检测为

应该是:

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

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

应该是:

getS3File().should.be.rejectedWith(Error); 
 类似资料:
  • 我有个小问题困扰着我。。下面的代码显示了一个异步测试,在那个测试中我们测试了一个我们无法控制的代码(测试用黑盒,我可以更改它)。 blackbox代码在事件完成后分派事件,测试侦听此事件并断言数据。 问题是,当有断言错误时,异常是由promise错误处理程序而不是由测试框架抛出和产生的,因此done函数永远不会执行,我们得到了这个测试的超时错误。 它很容易解决它的尝试和安培;catch在it()块

  • 我已经使用mocha测试框架和chai断言库用TypeScript编写了一些测试(我对这三种测试都不熟悉),并看到抛出了一个错误,并且在下面的代码中调用了assert.fail()。不过,测试仍标记为通过。我很困惑为什么会发生这种情况,以及我是否在承诺上做错了什么。另外,如下所示,还有一个UnhandledPromiserEjectionWarning。我不明白为什么这被标记为未处理,因为我已经包

  • 我有一个异步函数,我想同时测试成功和失败。函数成功时返回一个字符串,失败时抛出。我在测试失败上失败得很惨。下面是我的代码: 我通过注释失败的代码并在注释中添加结果来禁用 正如你所看到的,什么都不起作用。我相信我的测试几乎是第一个失败测试的Promises示例和最后一个失败测试的Async/Await示例的完全副本,但是没有一个可以工作。 我相信与Jest文档中的示例的不同之处在于,它们展示了如何测

  • 问题内容: 我的node.js摩卡套件中的典型测试如下所示: 这里的问题是,如果操作不正确,或者服务器中断并且从不调用,则将永远不会被调用。这给以前从未与测试人员一起工作过的人留下了模棱两可的错误,例如: 我的问题是,是否有一种方法可以重写这些测试,无论是与mocha一起使用还是与另一个lib一起使用,都可以使异步工作更容易遵循。我希望能够输出以下内容: 或类似的东西。 我不确定是否使用诸如pro

  • jasmine:在jasmine指定的超时内没有调用异步回调。DEFAULT_TIMEOUT_INTERVAL 测试window.post消息指令 用Jasmine async测试postMessage不起作用 我有下面的代码,我正在接收下面的输出。 在jasmine.DEFAULT\u timeout\u INTERVAL指定的超时内未调用异步回调 myService在父描述函数中定义。正如我所