我根据http://guides.emberjs.com/v2.2.0/routing/loading-and-error-substates/设置了错误子状路由/控制器/模板。手动浏览我的应用程序,我可以触发错误条件并转到子状态。与Ember Inspector确认。
我想自动测试子状态。但是,当路由的model
挂钩拒绝时,Ember CLI的测试运行器未通过任何测试。换句话说,在我可以导航到错误子状态之前测试失败。
如何自动测试我的错误子状态?
Ember:2.2.0
Ember CLI:1.13.13
答案 0 :(得分:2)
不幸的是,以干净的方式做这件事似乎并不容易。
在内部测试中,Ember使用bootApplication
来查找错误的路由(请参阅github),并能够直接捕获错误。不幸的是,如果您在测试中尝试对try/catch
或then/catch
进行任何形式的visit
或visit
,您会发现它失败了。
如果defaultActionHandlers.error
某个链接导致您的验收测试出现错误,那么Ember的logError
会被解雇。根据设计,它并不意味着可以覆盖。它会调用Ember.default.Logger.error
来调用currentRouteName
。
因此,为了测试这个子状态,我们需要暂时覆盖该方法。我们也可以在ember容器内窥视,以便像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
进行间谍活动:
onerrorDefault
事情可能变得更加复杂。如果你的RSVP
发生在Promise中(我们的情况确实如此,因为我们使用sinon进行测试)那么你还有更多要处理...
在Test.adapter.exception
的单独循环Ember.default.Logger.error
中,会调用Test.adapter.exception
和Ember.default.Logger.error
(再次!) - 传递堆栈。所以在这种情况下,您需要对<div id="analysisTabMap"></div>
和期望#analysisTabMap {
width: 100%;
height: 500px;
}
进行两次调用并进行间谍活动。