当前位置: 首页 > 面试题库 >

node.js如何使用Mocha为异步测试获取更好的错误消息

曾河
2023-03-14
问题内容

我的node.js摩卡套件中的典型测试如下所示:

 it("; client should do something", function(done) {
    var doneFn = function(args) {
      // run a bunch of asserts on args
      client.events.removeListener(client.events.someEvent, userMuteFn);
      done();
    }

    client.events.on(someEvent, doneFn);

    client.triggerEvent();
});

这里的问题是,如果client.triggerEvent()操作不正确,或者服务器中断并且从不调用someEventdone()则将永远不会被调用。这给以前从未与测试人员一起工作过的人留下了模棱两可的错误,例如:

Error: timeout of 10500ms exceeded. Ensure the done() callback is being called in this test.

我的问题是,是否有一种方法可以重写这些测试,无论是与mocha一起使用还是与另一个lib一起使用,都可以使异步工作更容易遵循。我希望能够输出以下内容:

the callback doneFn() was never invoked after clients.event.on(...) was invoked

或类似的东西。

我不确定是否使用诸如promises之类的方法会有所帮助。对于异步/回调类型代码,更有意义的错误消息将是一件好事。如果这意味着从回调/异步转移到另一个工作流,那么我也同意。

有什么解决方案?


问题答案:

当您收到超时错误而不是更精确的错误时, 要做的第一件事是检查您的代码没有吞噬异常,也没有吞噬承诺拒绝。
Mocha旨在检测您的测试中的这些。除非您执行不寻常的操作(例如在自己的VM中运行测试代码或操纵域),否则Mocha会检测到此类故障,但是如果您的代码吞噬了这些故障,Mocha将无法执行任何操作。

话虽这么说,Mocha无法告诉您done未调用,因为您的实现存在逻辑错误,导致无法调用回调。

sinon测试失败后执行后期验验可以采取以下措施。让我强调,这是 概念证明 。如果我想持续使用它,那么我将开发一个适当的库。

var sinon = require("sinon");
var assert = require("assert");

// MyEmitter is just some code to test, created for the purpose of
// illustration.
var MyEmitter = require("./MyEmitter");
var emitter = new MyEmitter();

var postMortem;
beforeEach(function () {
  postMortem = {
    calledOnce: []
  };
});

afterEach(function () {
  // We perform the post mortem only if the test failed to run properly.
  if (this.currentTest.state === "failed") {
    postMortem.calledOnce.forEach(function (fn) {
      if (!fn.calledOnce) {
        // I'm not raising an exception here because it would cause further
        // tests to be skipped by Mocha. Raising an exception in a hook is
        // interpreted as "the test suite is broken" rather than "a test
        // failed".
        console.log("was not called once");
      }
    });
  }
});

it("client should do something", function(done) {
  var doneFn = function(args) {
    // If you change this to false Mocha will give you a useful error.  This is
    // *not* due to the use of sinon. It is wholly due to the fact that
    // `MyEmitter` does not swallow exceptions.
    assert(true);
    done();
  };

  // We create and register our spy so that we can conduct a post mortem if the
  // test fails.
  var spy = sinon.spy(doneFn);
  postMortem.calledOnce.push(spy);
  emitter.on("foo", spy);

  emitter.triggerEvent("foo");
});

这是以下代码MyEmitter.js

var EventEmitter = require("events");

function MyEmitter() {
    EventEmitter.call(this);
}

MyEmitter.prototype = Object.create(EventEmitter.prototype);
MyEmitter.prototype.constructor = MyEmitter;

MyEmitter.prototype.triggerEvent = function (event) {
    setTimeout(this.emit.bind(this, event), 1000);
};

module.exports = MyEmitter;


 类似资料:
  • 问题内容: 我对如何在Mocha测试中包装嵌套的异步回调感到困惑。这是令人讨厌的代码示例:正在调用Amazon S3以检查文件是否存在: 代码挂起等待完成(如果我省略done())-或者,代码完成而没有回调,或者,节点抱怨done()被多次调用。 在下面的帮助下,我可以正常工作了,但看起来像是异步伏都炖菜 问题答案: 尝试使用async.serial。在第一个条目内,使用async.each运行多

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

  • 是否可以使用promises的ES6语法捕获异步错误?例如,以下操作不起作用(.catch未捕获错误): 但是这个同步版本有: 使用try/catch块和清除catch中的错误是执行以下操作的唯一解决方案吗? 对于这个问题,假设抛出错误的代码部分位于另一个命名函数中,因此它没有访问函数的权限。 谢谢 编辑:这里有一个更完整的示例,说明我想在JSFIDLE中做什么。

  • 全部: 我对Jasmine测试非常陌生,我想知道的一个关于异步测试的问题是: 有谁能简单解释一下Jasmine是如何知道里面有一个done()函数调用并等待它完成的? 例如,如果我把一些异步调用在之前: Jasmine怎么知道它应该让规范测试等待? 谢谢

  • 问题内容: 我正在使用JavaScript测试运行程序“摩卡”。 我的测试失败了,因此我将使用进行调试。 但是运行测试时,没有输出(仅来自Mocha的测试结果)。看来Mocha已捕获并抑制了我的输出! 如何让Mocha显示输出?(对于失败的测试)? 编辑: 抱歉!- 在测试期间可以正常工作!我肯定一直期望它抑制输出,而且我没有正确检查自己的代码。感谢您的回应。所以…话虽如此…也许抑制通过测试的输出