2015-12-03 1 views
1

Я установил маршрут подключения/контроллер/шаблон ошибки в соответствии с http://guides.emberjs.com/v2.2.0/routing/loading-and-error-substates/. Вручную просматривая мое приложение, я могу вызвать условия ошибки и перейти к подстанции. Подтверждено инспектором Ember.Как проверить погрешность погрешности Ember с тестовым бегуном Ember CLI?

Я хотел бы автоматически проверить подсостояние. Однако тестовый бегун Ember CLI не выполняет никаких тестов, когда крюк маршрута model отклоняется. Другими словами, тест завершился неудачно, прежде чем я смогу перейти к подстановке ошибок.

Как я могу автоматически проверить свою ошибку?

Ember: 2.2.0

Ember CLI: 1.13.13

ответ

2

К сожалению, это, кажется, не будет легко сделать это в более чистой манере.

В своих внутренних тестах, Ember использует bootApplication для маршрута, которые являются ошибками (см. github), и имеет возможность напрямую поймать ошибку. К сожалению, если вы попробуете сделать какие-либо формы try/catch или then/catch вокруг звонка visit в своих тестах, вы обнаружите, что он не работает.

Когда вы получаете visit ссылку, которая приводит к ошибке в вашем приемочном тесте, то defaultActionHandlers.error получает увольнение. По дизайну он не предназначен для переопределения. Он вызывает logError, который вызывает Ember.default.Logger.error.

Итак, чтобы протестировать это подэлемент, нам необходимо временно перезаписать этот метод. Мы также можем заглянуть внутрь контейнера Ember, чтобы получить доступ к currentRouteName как так (с использованием sinon для шпионажа):

test('when there is an API error an error message is shown', function(assert) { 

    const emberLoggerError = Ember.Logger.error; 
    Ember.Logger.error = sinon.spy(); 

    visit('/users/'); 

    andThen(() => { 
    // This could be nicer and less private with `getOwner` 
    let { currentRouteName } = this.application.__container__.lookup('router:main'); 
    assert.equal(currentRouteName, 'users.index_error', 'The current route name is correct'); 
    assert.equal(Ember.Logger.error.callCount, 1, 'The error logger was called'); 

    // Restore the Ember.Logger 
    Ember.Logger.error = emberLoggerError; 
    }); 
}); 

Вещи могут получить еще сложнее, хотя. Если visit происходит внутри Promise (это было в нашем случае, поскольку мы использовали ember-page-object для наших тестов), то у вас есть больше, чтобы иметь дело с ...

В отдельном цикле onerrorDefault из RSVP запускается, который вызывает Test.adapter.exception И Ember.default.Logger.error (снова!) - передача стека. Так что в этом случае вам нужно заглушить и шпионить на Test.adapter.exceptionи ожидать Ember.default.Logger.error, чтобы их называли дважды!

+0

Это поставило меня на правильный путь. Возможно, Ember 2.3.0 сгладил это. Чтобы мой тест не провалился, все, что мне нужно сделать, это заглушить 'Ember.Test.adapter.exception'. См. [This Gist] (https://gist.github.com/john-kurkowski/da3abb95329f14f19c19/6936cab4cb0a8cb0168137c5a6426cfc0a15aacb). – Bluu

Смежные вопросы