为什么失败的断言会触发一个promise catch?

时间:2017-09-05 22:45:52

标签: angularjs unit-testing mocha chai q

在为角度应用程序编写单元测试时,我遇到了意想不到的结果。我能够将意外行为压缩到样本测试中。

then块中的should.equal(true, false, 'should then')断言似乎触发了承诺的阻塞。

describe.only('test', function () {
  var $q, $rootScope;
  beforeEach(function () {
    inject(function(_$q_, _$rootScope_) {
      $q = _$q_;
      $rootScope = _$rootScope_.$new();
    });
  });


  var stubService = sinon.stub(service, 'getPanel');

  it('shall...', function() {
    //1
    $q.when().then(function() {
      console.log('log then')
      should.equal(true, false, 'should then') //<---assertion fails
    }).catch(function() {
      console.log('log catch') //<--- why does this block run?
      should.equal(true, false, 'should catch')
    })
    $rootScope.$apply(); //wait for promises to finish

  });
});

当我运行此测试时,输出为:

 LOG LOG: 'log then'
 LOG LOG: 'log catch'

  test
    ✗ shall...
  should catch: expected true to equal false

我期待:

LOG LOG: 'log then'

  test
    ✗ shall...
  should then: expected true to equal false

如果我使用这种风格,我会得到预期的结果:

$q.when().then(function() {
  console.log('log then')
  should.equal(true, false, 'should then')
}, function() {
  console.log('log catch')
  should.equal(true, false, 'should catch')
})

我公司的惯例是使用第一种风格,所以我想尽可能使用第一种风格。

1 个答案:

答案 0 :(得分:1)

您正在观察的行为的一个解释是,当条件不满足时,should.equal断言实际上throws an error

虽然您使用的是$q,但我相信此documentation on Promise behaviour仍适用,强调我的:

  

然后异步调用处理函数(onFulfilledonRejected)(一旦堆栈为空)。在调用处理函数之后,如果处理函数:... 抛出错误,则返回的promise将被抛弃,抛出的错误为其值;

因此,在您的情况下,should.equal引发的错误导致catch的代码块被执行,拒绝值是抛出的错误。