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

Mocha,should-当测试包含promise的异步函数时,断言错误是沉默的

杨君之
2023-03-14

我有个小问题困扰着我。。下面的代码显示了一个异步测试,在那个测试中我们测试了一个我们无法控制的代码(测试用黑盒,我可以更改它)。

blackbox代码在事件完成后分派事件,测试侦听此事件并断言数据。

问题是,当有断言错误时,异常是由promise错误处理程序而不是由测试框架抛出和产生的,因此done函数永远不会执行,我们得到了这个测试的超时错误。

它很容易解决它的尝试和安培;catch在it()块内,但是总是使用try&是一个好的实践吗;在it()块内捕获?到目前为止,我信任测试框架来处理异常

null

这里的提示帮助我解决了这个问题,但我不喜欢这些解决方案:https://github.com/mochajs/mocha/issues/1128.issuecomment-40866763

它与其他类似的问题不同,因为在it()块中,我们没有任何对promise对象的引用。

describe.only("test", function () {

  var event;

  // blackbox simulates a code we have no controler over
  // inside this code we have a promise, when this promise resolves it triggers event
  var blackbox = function () {
    var promise = new Promise(function (resolve, reject) {
      resolve();
    });

    promise.then(function () {
      event(4);
    }).catch(function (e) {
      console.log(e);
    });
  };

  it("async with blackbox promise", function (done) {
    // this simulates event listenner, when the event is triggered the code executes
    event = function (data) {
      // this assertion works and everything is fine
      data.should.be.equal(4);
      // this assertion thrown exception that is being cought by the promise reject handler and
      // isnt cought by the testing framework (chai / mocha)
      data.should.be.equal(5);
      // because the exception is thrown we never reach the done
      done();
    };

    blackbox();

  });
});

共有1个答案

郎正平
2023-03-14

中测试承诺的方式是返回承诺,并让它来决定何时失败或不失败。

因此,第一步是在 函数中使承诺可用:

// blackbox simulates a code we have no controler over
// inside this code we have a promise, when this promise resolves it triggers event
var blackbox = function () {
  var promise = new Promise(function (resolve, reject) {
    resolve();
  });

  return promise.then(function () {
    event(4);
  });
  // do not catch here unless you want the test to not fail on error
};

现在让我们更改测试代码以处理承诺:

it("async with blackbox promise", function () {
  // this simulates event listenner, when the event is triggered the code executes
  event = function (data) {
    // this assertion works and everything is fine
    data.should.be.equal(4);
    // this assertion thrown exception that is being cought by the promise reject handler
    data.should.be.equal(5);
  };
  // mocha will append a rejection handler to this promise here and fail if it gets called
  return blackbox();

});
 类似资料:
  • 因此,我试图测试当我用 将 存根拒绝时,异步函数是否抛出错误,但我得到的结果是,我的函数不是异步的,它不会抛出错误。 下面是我的 文件,其中的 : 测试: 我得到的错误是:1)主要 getFileFromS3应该是一个函数:AssertionError:[function:getS3File]应该是上下文中的asyncfunction.(testUnitMain.spec.js:28:27) 2)

  • 目标 建立一个 lesson6 项目,在其中编写代码。 main.js: 其中有个 fibonacci 函数。fibonacci 的介绍见:http://en.wikipedia.org/wiki/Fibonacci_number 。 此函数的定义为 int fibonacci(int n) 当 n === 0 时,返回 0;n === 1时,返回 1; n > 1 时,返回 fibonacci(

  • 我想知道哪种方法是测试不返回任何函数(只更改一个字段值)并包含异步调用的最佳方法。 这是我要测试的AngularJS控制器,我调用的服务返回一个promise(总是返回{name:"John"}): 如果sayHello函数不包含异步调用,这将是规范,但它总是失败,因为scope.greeting总是空的。 我将如何使用此规范来处理异步调用?我真的不明白如何以及在哪里使用Jasmine 2.0的“

  • 我有一个异步块: 我可以跟踪成功和失败的结果。但是,是否可以重试整个chain?然后继续重试,直到问题解决?

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

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