Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 期望承诺解决或拒绝不';我们不能像承诺的那样,在摩卡和柴的测试中失败_Javascript_Node.js_Mocha.js_Chai_Chai As Promised - Fatal编程技术网

Javascript 期望承诺解决或拒绝不';我们不能像承诺的那样,在摩卡和柴的测试中失败

Javascript 期望承诺解决或拒绝不';我们不能像承诺的那样,在摩卡和柴的测试中失败,javascript,node.js,mocha.js,chai,chai-as-promised,Javascript,Node.js,Mocha.js,Chai,Chai As Promised,使用和,我试图测试我的承诺是否得到了正确的解决和拒绝。但是chai承诺的expect函数没有正确地导致测试失败。例如: test.js const chai = require('chai') chai.use(require('chai-as-promised')) const expect = chai.expect describe('foo', () => { it('resolve expected', () => { expect(new Promise((

使用和,我试图测试我的承诺是否得到了正确的解决和拒绝。但是chai承诺的
expect
函数没有正确地导致测试失败。例如:

test.js

const chai = require('chai')
chai.use(require('chai-as-promised'))
const expect = chai.expect

describe('foo', () => {
  it('resolve expected', () => {
    expect(new Promise((res,rej) => {res()})).to.be.fulfilled
  })
  it('resolve unexpected', () => {
    expect(new Promise((res,rej) => {res()})).to.be.rejected
  })
  it('reject expected', () => {
    expect(new Promise((res,rej) => {rej()})).to.be.rejected
  })
  it('reject unexpected', () => {
    expect(new Promise((res,rej) => {rej()})).to.be.fulfilled
  })
})
当我执行
mocha test.js
时:

  foo
    ✓ resolve expected
    ✓ resolve unexpected
(node:2659) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): AssertionError: expected promise to be rejected but it was fulfilled with undefined
(node:2659) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
    ✓ reject expected
    ✓ reject unexpected
(node:2659) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 4): AssertionError: expected promise to be fulfilled but it was rejected with undefined


  4 passing (10ms)

您可以看到断言错误似乎被抛出,但mocha并没有发现它们。如何让mocha识别故障?

正如我们所确认的,并且为了将来的参考,问题是您没有在每次测试中返回断言

it('reject expected', () => {
  return expect(new Promise((res,rej) => {rej()})).to.be.rejected
})
it('reject unexpected', () => {
  return expect(new Promise((res,rej) => {rej()})).to.be.fulfilled
})

这就是为什么测试通过了,但后来在最终返回时打印了一个“未处理”的承诺。
return
关键字通知mocha等待异步函数解决/拒绝。

或者,对于承诺的chai库,您可以尝试使用chai.should和call.notify来指示其“完成”。像这样:

const chai = require('chai');
chai.use(require('chai-as-promised'));
chai.should();

const expect = chai.expect;

describe('foo', () => {
    it('resolve expected', () => {
        expect(new Promise((res, rej) => { res(); })).to.be.fulfilled;
    });
    it('resolve unexpected', (done) => {
        // expect(new Promise((res, rej) => { res(); })).to.be.rejected;
        new Promise((res, rej) => { res(); }).should.be.rejected.and.notify(done);
    });
    it('reject expected', (done) => {
        // expect(new Promise((res, rej) => { rej(); })).to.be.rejected;
        new Promise((res, rej) => { rej(); }).should.be.rejected.and.notify(done);
    });
    it('reject unexpected', (done) => {
        // expect(new Promise((res, rej) => { rej(); })).to.be.fulfilled;
        new Promise((res, rej) => { rej(); }).should.be.fulfilled.and.notify(done);
    });
});
通过这种方式,摩卡将识别测试失败:

foo
    √ resolve expected
    1) resolve unexpected
    √ reject expected
    2) reject unexpected


  2 passing (37ms)   2 failing

  1) foo
       resolve unexpected:
     AssertionError: expected promise to be rejected but it was fulfilled with undefined


  2) foo
       reject unexpected:
     AssertionError: expected promise to be fulfilled but it was rejected with undefined

检查chai as promised doc以获得进一步参考

我认为您应该返回
expect
呼叫。你试过在每个测试中添加
return
关键字吗?我只是试了一下。它起作用了。但是现在我想知道你是如何将多个
expect
语句放在一个测试中的?我不确定,我已经有一段时间没有使用chai promise库了。你能接受这个解决方案吗?这样其他人会更容易找到答案。另外,如果你回答第二个问题,请告诉我,我可以更新解决方案:)只要回报承诺:比使用
done
更简单、更干净。是的,同意你@Louis。我上面的建议只是为了展示如何使用chai作为承诺的不同风格,既然伊渥克问如何在一个测试中使用多个断言,那么在这种情况下就不可能使用“return”。如果我们想在测试promise时使用几个断言,那么使用“done”可能会起作用,但我确实认为我们应该使用单独的“it”来测试特定的案例。