Правильный момент для вызова метода $apply/$digest $rootScope в тесте

Документация по тестированию Angular показывает тестовый пример, где $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

person armoucar    schedule 03.01.2017    source источник


Ответы (1)


Показанный пример — это другой случай.

Оно использует

expect(resolvedValue).toEqual(123);

утверждение, которое не включает обещания.

С другой стороны,

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

использует chai-as-promised для утверждения. Он связывает state с then под капотом, чтобы получить значение и подтвердить его. И $q цепочек промисов выполняются только при дайджесте. Вот почему $rootScope.$digest() необходимо после eventually утверждений.

См. также этот ответ для получения более подробной информации о том, как протестировать Angular с помощью chai-as-promised.

person Estus Flask    schedule 03.01.2017