在 Ember App Kit 中,初始 repo 附带了许多测试示例。其中之一是基本的路由单元测试。如果数据在模型钩子中硬编码,则此测试很简单,如下所示:
test("#model", function(){
deepEqual(route.model(), ['red', 'yellow', 'blue']);
});
如果模型钩子从 ember-data 返回一个承诺,你如何使用隔离容器来测试它?
这是测试:
import Activities from 'appkit/routes/activities';
var route;
module("Unit - ActivitiesRoute", {
setup: function(){
var container = isolatedContainer([
'route:activities'
]);
route = container.lookup('route:activities');
}
});
test("#model", function(){
deepEqual(route.model(), ['activity', 'activity2', 'activity3']);
});
和实际路线的模型挂钩:
export default Ember.Route.extend({
model: function() {
return this.get('store').find('activity');
}
});
更新:
在从 kingpin2k 实施以下不同方法之后。这是结果的摘要。
第一种方法:效果很好......但没有承诺。
第二种方法:返回 promise 对象(似乎已解决),但将数组和正确的值分配给 _detail 属性。
test("#model", function(){
deepEqual(route.model()['_detail'], ['activity', 'activity2', 'activity3']); //passes
});
我希望在模块 setup() 中处理商店创建。
...
module("Unit - ActivitiesRoute", {
setup: function(){
var container = isolatedContainer([
'route:activities'
]);
route = container.lookup('route:activities');
var store = {
find: function(type){
return new Em.RSVP.Promise(function(resolve){
resolve(['activity', 'activity2', 'activity3']); // or made up model(s) here
});
}
};
route.set('store', store);
}
});
和测试:
test("#model", function(){
deepEqual(route.model(), ['activity', 'activity2', 'activity3']); // ???
});
第三种方法:
...
module('Unit - ActivitiesRoute', {
setup: function() {
var container = isolatedContainer([
'route:activities'
]);
route = container.lookup('route:activities');
var store = {
find: function() {
var promise = new Ember.RSVP.Promise(function(resolve) {
Em.run.later(function() {
resolve(Activity.FIXTURES);
}, 10);
});
return Ember.ArrayProxy.extend(Ember.PromiseProxyMixin).create({
promise: promise
});
}
};
route.set('store', store);
}
});
在测试中,调用 route.model() 返回一个空对象 {} :
test("#model", function(){
deepEqual(route.model(), Activity.FIXTURES); // returns {}
});
更新#2
还需要添加 asyncTest() 而不是 test() 并调用 start() 以防止测试运行程序挂起。
asyncTest('#model', function(){
Em.run(function(){
route.model().then(function(result){
ok(result);
equal(result, Activity.FIXTURES);
start();
});
});
});