Mocha 不显示失败测试的任何详细信息

Mocha isn't displaying any details for failed tests

我正在将应用程序从 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>

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

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 文档中建议的第一个策略是使用“完成”回调。这是 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();

      });
    });
  });

});

上面的测试可以正常工作并显示测试通过,但是在同一个 then 回调中调用 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 的失败消息与实际和预期的区别..

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

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

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

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