Node.js 摩卡咖啡&x2B;柴-没有关于错误的详细信息

Node.js 摩卡咖啡&x2B;柴-没有关于错误的详细信息,node.js,express,testing,mocha.js,chai,Node.js,Express,Testing,Mocha.js,Chai,我对摩卡和柴有意见。我的测试没有显示失败测试的错误(例如,预期“a”为“b”) 示例代码: it('Shouldn\'t publish new post - some required fields are empty', done => { request(app) .post('/posts') .set('Authorization', `Bearer ${token}`) .send()

我对摩卡和柴有意见。我的测试没有显示失败测试的错误(例如,预期“a”为“b”)

示例代码:

it('Shouldn\'t publish new post - some required fields are empty', done => {
        request(app)
          .post('/posts')
          .set('Authorization', `Bearer ${token}`)
          .send()
          .end((err, { body }) => {
            if(err) {
              return done(err);
            }

            expect(body).to.have.property('errors');

            return done();
          });
      });
我认为问题不直接在于摩卡或柴。我的回购协议:

您所需要做的就是克隆repo、安装依赖项并运行mongodb。请随意创建falsy测试并查看输出


最好的问候

问题在于,由于嵌套回调,错误没有得到一致的处理。如果
expect(body)…
断言失败,这将导致异步错误,该错误永远不会用
done(error)
报告给当前测试,因此所有异步断言都应该用
try..catch
包装

更好的方法是使用摩卡本地支持的承诺。这允许在不进行
done
回调的情况下始终如一地处理错误:

  it('Shouldn\'t publish new post - outdated/wrong token', async () => {
    const { body } = await request(app)
      .post('/posts')
      .set('Authorization', 'Bearer blah_blah_blah')
      .send();

    expect(body).to.have.property('errors');
  });

此断言可能导致测试运行程序无法处理的错误。如果失败,则永远不会调用done。应该用try.catch包装。我不确定这是否是这里唯一的问题,但这是其中之一。所以你说我应该将所有预期都包装在try-catch块中,并在当前状态下调用done-with-error?是的。一个更好的方法是改用承诺,并更一致地处理错误。是否期望回报承诺,这样我就可以链。抓住它?在docsI中没有找到任何内容。我将很快发布一个示例。考虑用问题导致问题的相关代码更新问题,所以规则要求一个问题是可以理解的,而不需要遵循场外链接。您的代码不仅看起来更好,而且在一开始就可以正常工作。我不知道expect会在失败时抛出错误——现在我很清楚了。再次感谢。很高兴它起了作用。expect在失败时抛出一个错误——这就是所有断言的工作方式。你可以使用Node
assert
或者直接抛出它们(如果你愿意的话),Chai只是提供了更好的API和更有意义的消息很高兴你解决了。我第一次写测试。
  it('Shouldn\'t publish new post - outdated/wrong token', async () => {
    const { body } = await request(app)
      .post('/posts')
      .set('Authorization', 'Bearer blah_blah_blah')
      .send();

    expect(body).to.have.property('errors');
  });