正确的时刻在测试中调用$ rootScope的$ apply / $ digest方法

时间:2017-01-03 13:35:16

标签: angularjs promise mocha chai chai-as-promised

Angular测试文档显示test sample,其中在测试断言之前调用$ apply。我试着这样做,但我的测试不能正常工作。应该破解的第一个代码,有效...似乎我的断言没有运行。第二个代码,我的测试有效,但它与文档不同(我更喜欢这种风格)。

首先:

it('tests angular promises', function() {
    getABC = function() {
        return $q((resolve, reject) => {
            resolve('abc');
        });
    };

    var state = getABC()

    $rootScope.$apply()
    // assertions come after $apply call as in documentation: doesn't work.
    state.should.eventually.be.equal('abcc') 
})

------
✓ tests angular promises


1 passing (78ms)

第二

it('tests angular promises', function() {
    getABC = function() {
        return $q((resolve, reject) => {
            resolve('abc');
        });
    };

    var state = getABC()

    state.should.eventually.be.equal('abcc')
    // assertions come before  $apply call: works
    $rootScope.$apply()
})

------
1 failing

1) tests angular promises:

  AssertionError: expected 'abc' to equal 'abcc'
  + expected - actual

  -abc
  +abcc

1 个答案:

答案 0 :(得分:1)

显示的example是另一种情况。

使用

expect(resolvedValue).toEqual(123);

断言不涉及承诺。

另一方面,

state.should.eventually.be.equal('abcc')

使用chai-as-promised进行断言。它将statethen链接在一起以获取值并断言它。并且$q承诺链仅在摘要上执行。这就是$rootScope.$digest()断言后eventually是必要的原因。

有关如何使用chai-as-promised测试Angular的详细信息,另请参阅this answer