【问题标题】:Mocha isn't displaying any details for failed testsMocha 没有显示失败测试的任何详细信息
【发布时间】:2018-08-17 04:59:15
【问题描述】:

我正在将一个应用程序从 Sails.js v0.12 迁移到 v1.0,其中包括将 mocha 从 ^3.5.0 升级到 ^5.2.0。我认为这是问题的根源,但我似乎找不到解决办法。

以前,当测试失败时,mocha 报告器输出的末尾会有一个错误摘要:失败的具体断言、文件名、行号、错误消息等。现在,报告器正在着色it 块为红色,但未显示其他详细信息。

我尝试更改 mocha.opts 中的报告器,它适用于实际执行输出,但最后没有启用摘要。我错过了什么?

// ./test/integration/models/User.test.js

describe('User', () => {

  describe('find()', () => {
    it('should return an array of users', () => {
      return User.find()
      .then((users) => {

        users.should.be.a('array');
        true.should.be.false;  // No problems if this is removed

      });
    });
  });

});

在控制台中:

> node ./node_modules/mocha/bin/mocha test/lifecycle.test.js test/integration/**/*.test.js


√ OtherModel method() should do something: 17ms
1) User find() should return an array of users
'Done.'
PS C:\repos\myproject>

【问题讨论】:

    标签: node.js sails.js mocha.js


    【解决方案1】:

    事实证明 Mocha 很好,我的测试定义也很好,我只是错误地修复了一个完全不同的迁移问题。从版本 4 开始,mocha will no longer automatically kill itself 认为所有测试都已完成。这意味着必须使用以下两个选项之一:

    1. --exit 添加到 mocha.opts 或调用该命令的任何位置
    2. 在测试套件的 JavaScript 中运行 process.exit()

    我尝试了第二个选项,将process.exit() 添加到我的测试引导文件中的after() 块中。 这是一个坏主意,导致上述行为令人困惑。

    为了解决我的问题,我删除了对 after() 块的更改,并将 --exit 添加到 mocha.opts。感谢 Dhruv Choudhary 为我指明了正确的方向。

    【讨论】:

      【解决方案2】:

      你可以使用 done 回调。 mocha 文档中建议的第一个策略是使用“完成”回调。这是 it 中回调的一个额外参数。您在测试中的最后一个断言之后调用它。

      我见过很多人以错误的方式使用 done() 方法。例如,看下面的代码,

      describe('User', () => {
      
        describe('find()', () => {
          it('should return an array of users', (done) => {
            return User.find()
            .then((users) => {
      
              users.should.be.a('array');
              true.should.be.false;  // No problems if this is removed
              done();
      
            });
          });
        });
      
      });
      

      上面的测试可以正常工作并显示测试通过,但是在同一个回调中调用 done() 是一个坏主意,因为上面的代码在你的期望失败之前运行良好,你可能会得到类似的错误

      上面的失败不是很有用。如果我们想利用 mocha 的错误,我们不应该从同一个 then() 回调中调用 done()。看下面的测试

      describe('User', () => {
      
          describe('find()', () => {
              it('should return an array of users', (done) => {
                  return User.find()
                      .then((users) => {
      
                          users.should.be.a('array');
                          true.should.be.false;
                      })
                      .then(() => done(), done)
                      .catch((error) => {
                          done(error);
      
                      });
              });
          });
      });
      

      不要忘记用 catch 块包装你的错误。 现在看看 mocha 的失败信息与实际的和预期的不同..

      【讨论】:

      • 你说得对, .catch() 块有效,但我的旧 mocha 测试显示有用的错误消息,而无需添加额外的代码。出于某种原因,这在 mocha v5 中是否发生了变化?
      • 另外,我试用了您的代码。在我的测试环境中,将错误传递给 done() 似乎没有任何效果。到目前为止我发现的最好的解决方法是.catch(console.error);
      • 我认为它与 mocha 版本无关(虽然不太确定,请查看最新 mocha 版本中的修复:github.com/mochajs/mocha/issues/3226)。您处理承诺的方式可能存在问题,因为旧的(2013 年之前)承诺库“吞下了”您自己没有处理的未处理的承诺拒绝。现在不是这样了,你必须用 catch 块来处理它。
      • 那个问题页面很有帮助,谢谢。看起来我的麻烦在于将process.exit(); 添加到mocha 的after() 块中,以试图在没有--exit 的情况下干净地退出。我想我需要把它放在别的地方......
      【解决方案3】:

      请尝试在您的测试用例中添加完成回调。

      describe('User', () => {
      
        describe('find()', () => {
          it('should return an array of users', (done) => {
            return User.find()
            .then((users) => {
      
              users.should.be.a('array');
              true.should.be.false;  // No problems if this is removed
              done();
      
            });
          });
        });
      
      });
      

      【讨论】:

      • 其实我已经试过了。在 mocha 中,你要么使用 done() 函数,要么返回一个 Promise,但不能同时使用两者。它只是抛出一个错误,但仍然只导致红色文本,没有详细信息。
      猜你喜欢
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 2016-07-05
      • 2020-09-28
      • 1970-01-01
      相关资源
      最近更新 更多