Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 余烬应用程序套件和测试模型挂钩_Ember.js_Ember Data_Ember App Kit - Fatal编程技术网

Ember.js 余烬应用程序套件和测试模型挂钩

Ember.js 余烬应用程序套件和测试模型挂钩,ember.js,ember-data,ember-app-kit,Ember.js,Ember Data,Ember App Kit,在Ember应用程序工具包中,有许多随初始回购一起提供的测试示例。其中之一是基本路线单元测试。如果数据在模型钩子中硬编码,则此测试很简单,如下所示: test("#model", function(){ deepEqual(route.model(), ['red', 'yellow', 'blue']); }); 如果模型钩子从余烬数据返回承诺,如何使用隔离容器来测试它 以下是测试: import Activities from 'appkit/routes/activities';

在Ember应用程序工具包中,有许多随初始回购一起提供的测试示例。其中之一是基本路线单元测试。如果数据在模型钩子中硬编码,则此测试很简单,如下所示:

test("#model", function(){
  deepEqual(route.model(), ['red', 'yellow', 'blue']);
});
如果模型钩子从余烬数据返回承诺,如何使用隔离容器来测试它

以下是测试:

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']);
});
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()中处理存储创建

以及测试:

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']);
});
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();
    });
  });
});

简单的方法是,这是一个单元测试,所以实际上您没有测试存储,所以设置一个模拟存储并生成结果

route = container.lookup('route:activities');
var store = {
   find: function(type){
      equal(type, 'activity', 'type is activity');
      return ['activity', 'activity2', 'activity3'];
   }
}

route.set('store', store);
更好的是,你还可以复制承诺

route = container.lookup('route:activities');
var store = {
   find: function(type){
      equal(type, 'activity', 'type is activity');
      return new Em.RSVP.Promise(function(resolve){
        resolve(['activity', 'activity2', 'activity3']);  // or made up model(s) here
      });
   }
}

route.set('store', store);
如果要更紧密地复制余烬数据,可以使用ArrayProxy实现PromiseProxyMixin

route = container.lookup('route:activities');
var store = {
   find: function(type){
      equal(type, 'activity', 'type is activity');
      var promise = new Ember.RSVP.Promise(function(resolve){
        Em.run.later(function(){
          resolve(['activity', 'activity2', 'activity3']);
        }, 10);
      });

      return Ember.ArrayProxy.extend(Ember.PromiseProxyMixin).create({
        promise: promise
      });
   }
}

route.set('store', store);
更新 使用上一种方法,您应该像这样实现它

test("#model", function(){
  route.model().then(function(result){
    deepEqual(result, Activity.FIXTURES); // returns {}
  });
});
但是,这里有一些棘手的问题,因为它有一个异步响应,您可能希望将其包装在一个Ember运行循环中

test("#model", function(){
  Em.run(function(){
    route.model().then(function(result){
      deepEqual(result, Activity.FIXTURES); // returns {}
    });
  });
});

仔细看这里,我得到了返回的承诺,但是当使用第二种方法而不使用PromiseProxyMixin时,数组被分配到_detail属性。我用一些额外的发现更新了原始问题。当某个东西返回承诺时,您需要使用then来访问值,
PROMIX.then(函数(结果){//result in here is the result of the promise});
whoops,我在看到你的评论后添加了评论,请查看我在底部的更新答案。不确定是否有更简洁的方法,但我不得不添加asyncTest()而不是test(),并调用start()为了防止测试运行程序挂起,我正在查看QunitAdapter和asyncEnd,想知道是否有更好的方法进行ember测试。