【问题标题】:How to test Ember error substate, with Ember CLI test runner?如何使用 Ember CLI 测试运行程序测试 Ember 错误子状态?
【发布时间】:2015-12-03 19:20:32
【问题描述】:

我根据http://guides.emberjs.com/v2.2.0/routing/loading-and-error-substates/ 设置了错误子状态路由/控制器/模板。手动浏览我的应用程序,我可以触发错误条件并被定向到子状态。与 Ember Inspector 确认。

我想自动测试子状态。但是,当路由的 model 钩子拒绝时,Ember CLI 的测试运行程序会失败任何测试。换句话说,在我导航到错误子状态之前测试失败了。

如何自动测试我的错误子状态?

灰烬:2.2.0

Ember CLI:1.13.13

【问题讨论】:

    标签: ember.js ember-cli


    【解决方案1】:

    不幸的是,以干净的方式做到这一点似乎并不容易。

    在其内部测试中,Ember 使用bootApplication 指向出现错误的路由(请参阅github)并且能够直接捕获错误。不幸的是,如果您尝试在测试中围绕调用visit 执行任何形式的try/catchthen/catch,您会发现它失败了。

    当您visit 链接导致验收测试出现错误子状态时,Ember 的 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 进行测试),那么您需要处理更多...

    RSVP 的单独循环中onerrorDefault 被触发,该循环调用Test.adapter.exceptionEmber.default.Logger.error(再次!)- 传递堆栈。因此,在这种情况下,您需要对 Test.adapter.exception 进行存根和监视 并且预计 Ember.default.Logger.error 会被调用两次!

    【讨论】:

    • 这让我走上了正确的道路。也许 Ember 2.3.0 已经解决了这个问题。为了使我的测试不会失败,我需要做的就是存根Ember.Test.adapter.exception。见this Gist
    猜你喜欢
    • 2017-11-07
    • 1970-01-01
    • 2015-03-21
    • 2015-12-17
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2015-03-18
    相关资源
    最近更新 更多