ember.js - Ember App Kit 和测试模型 Hook

标签 ember.js ember-data ember-app-kit

在 Ember App Kit 中,初始存储库附带了许多测试示例。其中之一是基本的路线单元测试。如果数据硬编码在模型 Hook 中,则此测试很简单,如下所示:

test("#model", function(){
  deepEqual(route.model(), ['red', 'yellow', 'blue']);
});

如果模型钩子(Hook)从 ember-data 返回 promise ,如何使用隔离容器来测试模型钩子(Hook)?

这是测试:

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

以及实际路线的模型 Hook :

export default Ember.Route.extend({
  model: function() {
    return this.get('store').find('activity');
  }
});

更新:

在实现 kingpin2k 的以下不同方法之后。以下是结果摘要。

第一种方法:效果很好......但没有 promise 。

第二种方法:返回 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();
    });
  });
});

最佳答案

简单的方法,这是一个单元测试,所以实际上您没有测试商店,因此设置一个模拟商店和结果。

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

route.set('store', store);

更好的是,您还可以复制 promise

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

如果你想更精确地复制 Ember 数据,你可以使用实现 PromiseProxyMixin 的 ArrayProxy...

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

关于ember.js - Ember App Kit 和测试模型 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21535399/

相关文章:

ember.js - 观察数组属性

javascript - 如何为 Ember 数据创建自定义序列化程序

javascript - 在 ember 路由中使用模型哈希时,模型对象未保留

ember.js - 在 Github Pages 上的 Ember.js 中获取没有哈希的 url

ember.js - Ember 应用套件 : Set Resolver outside of Ember. Application.create()

javascript - Ember.js 从 Controller 绑定(bind)到 Ember.Object 中的计算属性不起作用

ember.js - 如何在验收测试中触发滚动事件

css - 将 Bootstrap v4.0.0-alpha.3 添加到 Ember 应用程序

ember.js - 从 Ember Data 支持的 ArrayController 添加/删除项目

javascript - 注册成功后登录 Ember-Simple-Auth