Node.js 摩卡咖啡不是';t显示失败测试的任何详细信息

Node.js 摩卡咖啡不是';t显示失败测试的任何详细信息,node.js,sails.js,mocha.js,Node.js,Sails.js,Mocha.js,我正在将一个应用程序从Sails.js v0.12迁移到v1.0,其中包括将摩卡从^3.5.0升级到^5.2.0。我认为这是问题的根源,但我似乎找不到解决办法 以前,当测试失败时,mocha reporter输出的末尾会有一个错误摘要:失败的特定断言、文件名、行号、错误消息等。现在,reporter将it块涂成红色,但不会显示其他详细信息 我曾尝试在mocha.opts中更改reporter,它适用于实际的执行输出,但最终没有启用摘要。我错过了什么 // ./test/integration/m

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

以前,当测试失败时,mocha reporter输出的末尾会有一个错误摘要:失败的特定断言、文件名、行号、错误消息等。现在,reporter将it块涂成红色,但不会显示其他详细信息

我曾尝试在mocha.opts中更改reporter,它适用于实际的执行输出,但最终没有启用摘要。我错过了什么

// ./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();

      });
    });
  });

});

您可以使用done回调。mocha文档中建议的第一个策略是使用“done”回调。这是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开始,当它认为所有的测试都已完成时。这意味着必须使用以下两个选项之一:

  • --exit
    添加到mocha.opts或调用命令的任何位置
  • 在测试套件的JavaScript中运行
    process.exit()
  • 我尝试了第二个选项,将
    process.exit()
    添加到测试引导文件中的
    after()
    块中这是一个坏主意,导致了上述混乱行为。


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

    事实上,我已经试过了。在mocha中,您要么使用done()函数,要么返回一个承诺,但决不能同时使用这两个函数。它只是抛出了一个错误,但仍然只会导致红色文本,没有详细信息。您是对的,.catch()块可以工作,但是我以前的mocha测试显示了有用的错误消息,而没有添加额外的代码。这在摩卡v5中是否因为某种原因发生了变化?此外,我还试用了您的代码。在我的测试环境中,将错误传递给done()似乎没有任何效果。到目前为止,我发现最好的解决方法是
    .catch(console.error)我认为它与mocha版本无关(虽然不是很确定,但请查看最新mocha版本中的修复:)。这可能与您处理承诺的方式有关,因为较旧的(2013年之前)承诺库“吞并”了您自己未处理的未处理承诺拒绝。现在不是这样,你必须用catch block来处理它。这个问题页面是一个很大的帮助,谢谢。看来我的麻烦源于添加
    process.exit()
    到摩卡的
    after()
    块,试图在没有
    的情况下干净地退出--exit
    。我想我需要把它放在别的地方。。。