【问题标题】:How do you access an ember data store instance in an integration test?如何在集成测试中访问 ember 数据存储实例?
【发布时间】:2016-01-13 16:53:40
【问题描述】:

这适用于 Ember 2.2.0。我想使用来自我的 API 服务器的实时数据使用ember-data 来测试我的组件,而不是来自测试助手、手动 AJAX 请求或来自ember-cli-mirage 之类的工具的模拟数据。目前我在我的测试中只有这段代码:

import { moduleForComponent, test } from 'ember-qunit';
import hbs from 'htmlbars-inline-precompile';

moduleForComponent('checkbox-group', 'Integration | Component | checkbox group', {
  integration: true
});

test('it renders', function(assert) {
  this.render(hbs`{{checkbox-group}}`);
  assert.equal(this.$().text().trim(), '');
});

我想做的是这样的:

test('it renders', function(assert) {
  const store = getStoreFromSomewhere();
  const model = store.find('data').then(() => {
    this.render(hbs`{{checkbox-group data=model}}`);
    // Do testing on component with model from server
  });
});

问题是我不知道如何获取 store 实例,另外我不知道 ember 是如何进行异步测试的。

文档帮助不大:/。有人可以让我知道如何获取商店实例,如果不可能,用ember-data 进行此测试的另一种方法?

【问题讨论】:

  • 检查了我的一个旧测试,我得到了它“var store = this.store();”
  • @kristjanreinhold 没用 :(
  • 还有那个 import "import { test, moduleForModel } from 'ember-qunit';" > 完整测试链接 => dpaste.com/26GKG3G
  • 我在这里回答了类似的问题:stackoverflow.com/a/53868283/6423435

标签: javascript unit-testing ember.js integration-testing


【解决方案1】:

我相信,这更像是验收测试而不是集成测试。验收测试设置整个应用程序,以便您可以对其进行测试。

我相信在集成测试中你应该伪造模型,例如:

test('it renders', function(assert) {
  const modelValue = Ember.Object.create({
     prop1: value1,
     prop2: value2,
  });
  this.set('model', modelValue);
  this.render(hbs`{{checkbox-group data=model}}`);
  // Do testing on component with fake model
  });
});

话虽如此,而且我认为我要说的这一点仅在 Ember 2.2 之前有效(我相信在 Ember 2.3 中已弃用)。您可以执行以下操作:

let store = this.container.lookup('service:store');

但是,如果你这样做......你在使用商店时会收到一个错误。

“断言失败:您打开了测试模式,这禁用了 运行循环的自动运行。您将需要使用异步包装任何代码 跑步的副作用”

这意味着您需要将异步代码包装在 Ember.run 中

Ember.run(() => {
  let store = this.container.lookup('service:store');
  store.findAll('post').then((posts) => {
     //do stuff
  });
});

我的两分钱是,不要在集成测试中直接使用商店。

【讨论】:

    【解决方案2】:

    moduleForComponent 规范中,我相信规范的做法是这样的:

    var store = Ember.getOwner(this).lookup("service:store");

    相对于:

    var store = this.container.lookup('service:store');

    而且,您可以在 beforeEach 中像这样模拟它:

    this.promise = new Ember.RSVP.Promise((resolve) => {
      var response  = anEmberObject; 
      resolve(response);
    });
    
    this.storeMock = Ember.Service.extend({
      save: ()=>{
        return this.promise;
      },
      reload: (query)=>{
        return this.promise;
      }
    });
    
    
    Ember.getOwner(this).register('service:store', this.storeMock);
    Ember.getOwner(this).inject('component', 'store', 'service:store');
    

    【讨论】:

    • 很高兴知道它适用于哪个版本的 Ember,因为 getOwner 在 2.3 之前不可用,并且在集成测试中使用 polyfill 仍然无法访问存储。 container.lookup 甚至在 1.13 中都不起作用...
    猜你喜欢
    • 2023-03-04
    • 2015-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2022-07-11
    相关资源
    最近更新 更多