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