2016-01-13 50 views
0

这是Ember 2.2.0。我想用我的API服务器上的实时数据测试我的组件,使用ember-data不模拟来自测试帮助程序的数据,手动AJAX请求或者使用ember-cli-mirage之类的工具。目前,所有我在我的测试是这样的代码:如何在集成测试中访问一个ember数据存储实例?

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 
    }); 
}); 

的问题是我不知道如何让存储实例,另外我不知道异步测试是如何实现的。

该文档不够有用:/。有人可以让我知道如何获得商店实例,如果这是不可能的,另一种方式来做ember-data这个测试?

+0

检查了我的旧测试,我知道“var store = this.store();” –

+0

@kristjanreinhold没有工作:( – m0meni

+0

也有导入“导入{测试,moduleForModel'从'ember-qunit';”>链接到完整测试=> http://dpaste.com/26GKG3G –

回答

2

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

我相信,在集成测试你应该假冒模型,如:

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 
    }); 
}); 

随着中说,而且我觉得这个我会说是唯一有效的,直到灰烬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 
    }); 
}); 

我的两分钱是,不要直接在集成测试使用的存储。

1

moduleForComponent规范我相信cannonical的方式来做到这一点,像这样:

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'); 
+0

会很高兴由于getOwner在2.3之前不可用,并且使用polyfill仍然无法访问集成测试中的存储容器,所以知道它适用于哪种版本的Ember。lookup'在1.13中甚至不起作用... – kevlarr