如何使用Ember CLI测试运行器测试Ember错误子状态?

时间:2015-12-03 19:20:32

标签: ember.js ember-cli

我根据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

1 个答案:

答案 0 :(得分:2)

不幸的是,以干净的方式做这件事似乎并不容易。

在内部测试中,Ember使用bootApplication来查找错误的路由(请参阅github),并能够直接捕获错误。不幸的是,如果您在测试中尝试对try/catchthen/catch进行任何形式的visitvisit,您会发现它失败了。

如果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.exceptionEmber.default.Logger.error(再次!) - 传递堆栈。所以在这种情况下,您需要对<div id="analysisTabMap"></div> 期望#analysisTabMap { width: 100%; height: 500px; } 进行两次调用并进行间谍活动。