【问题标题】:How to test route's willTransition action in Ember?如何在 Ember 中测试路由的 willTransition 动作?
【发布时间】:2016-10-10 15:06:28
【问题描述】:

如何在 Ember 中测试此代码?请大致解释一下这个概念。

// app/routes/products/new.js
import Ember from 'ember';

export default Ember.Route.extend({
  model() {
    return this.store.createRecord('product');
  },
  actions: {
    willTransition() {
      this._super(...arguments);
      this.get('controller.model').rollbackAttributes();
    }
  }
});

我不知道怎么做。可能是路径中的存根模型?我发现商店在路线测试中不可用。

在 Ruby 和 RSpec 之后,所有这些新的 javascript 世界都有些混乱)但我还是想学习它。

【问题讨论】:

  • Cour 代码错误 ;),willTransition 是一个钩子,而不是一个动作。不要把它放在actions 哈希中。你可以叫它休息。您可以存根存储。
  • @Lux 在willTransition 钩子中编写我们的逻辑,我们应该在操作中定义它吗?。
  • @Lux,嗯,你知道,根据指南guides.emberjs.com/v2.8.0/routing/… willTransition 出现在操作哈希中。 “当尝试转换时,无论是通过 {{link-to}}、transitionTo 还是 URL 更改,都会在当前活动的路由上触发 willTransition 操作。” - 他们称之为“动作”,而不是“钩子”。
  • 无关,但 currentModel 是一个私有方法,而不是获取你的......当前模型的“余烬”方式......在路线中:github.com/emberjs/ember.js/issues/11760我不是非常了解在 Ember 中进行测试,但是如果您无法从测试中访问商店,我不确定您是否可以对此进行测试。在给定的示例中,回滚属性将从存储中删除未保存的模型,或从现有模型中删除任何未保存的更改 - 再次从存储中删除。
  • 好吧,显然我错了。对不起。这很有趣。

标签: ember.js qunit ember-testing


【解决方案1】:

在单元测试中,想法是存根所有外部依赖项。在 ember 中,您可以这样做:

// tests/unit/products/new/route-test.js
test('it should rollback changes on transition', function(assert) {
  assert.expect(1);
  let route = this.subject({
    controller: Ember.Object.create({
      model: Ember.Object.create({
        rollbackAttributes() {
          assert.ok(true, 'should call rollbackAttributes on a model');
        }
      })
    })
  });
  route.actions.willTransition.call(route);
});

基本上,您将存根控制器和模型传递给this.subject(),然后调用您正在测试的任何函数(在这种情况下,您必须使用 call 或 apply 来调用具有正确范围的操作),然后断言 @987654323 @ 被调用。

assert.expect(1); 在测试开始时告诉 QUnit 正好等待 1 个断言。

【讨论】:

  • 只是一个小提示,你可以调用route.actions.willTransition.call(route); 而不是route.send('willTransition');
猜你喜欢
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
相关资源
最近更新 更多