4

コントローラーをテストするための単体テストを作成しようとしています。モデルで計算されたプロパティを使用する計算されたプロパティがあります。

データをモデルにロードするためのテストをセットアップする方法がわかりません。

ここに私のモデルがあります:

App.User = DS.Model.extend({
  name: DS.attr('string'),
  roles: DS.hasMany('role'),

  isInstructor: function(){
    return this.hasRole('instructor');
  }.property('roles'),

  hasRole: function(role_name){
    var roles = this.get('roles');
    if(!Ember.isEmpty(roles)){
      return roles.any(function(role){
        return role.get('name') === role_name;
      });
    }
    return false;
  }
});

そして、ここにコントローラーがあります:

App.MyClassDetailsController = Ember.ObjectController.extend({
  students: function () {
    return this.get('users').filter(function (user) {
      return !user.get('isInstructor');
    });
  }.property('content.users.@each')
});

私のテストでは、コントローラーのコンテンツをセットアップするときに次のようにします。

myClassDetailsController.set('model', Ember.ObjectProxy.create({
  id: 389,
  name: 'bfcoding 101',
  users: Ember.ArrayProxy.create({
    content: [
      Ember.ObjectProxy.create({id: 1, name: 'Joe', roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'instructor'})]})}),
      Ember.ObjectProxy.create({id: 2, name: 'vs', roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'student'})]})}),
      Ember.ObjectProxy.create({id: 3, name: 'Volcano', roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'student'})]})})
    ]
  })
}));

そして、それは明らかに正しくロードされません。その学生のメソッドを呼び出すと、次のようになります。

myClassDetailsController.get('students.length')

すべてのユーザーを返します。

ここにjsbinがありますhttp://jsbin.com/zafod/1/

jsbin では、すべてのユーザーをフィルタリングすると、モデル データが読み込まれないため、 isInstructor 計算プロパティが呼び出されることはありません (私は推測します)。その呼び出しを行うと、未定義に戻ります。

では、そのデータをモデルにロードするにはどうすればよいでしょうか?

ありがとう!

4

1 に答える 1

6

isInstructorインスタンス上でApp.Userはなく、のEmber.ObjectProxyインスタンス上に存在します。のインスタンスを作成するか、プロキシ インスタンス App.Userで定義する必要があります。isInstructor

個人的には後者にします。完璧な単体テストの世界では、コントローラーをテストしているのではないApp.Userので、他のすべてを嘲笑したり、完璧に動作していると見なしたりする必要はありません。明らかに、統合テストに切り替えると、これはすべて変わりますが、これも単体テストです。

Ember.ObjectProxy.create({id: 1, isInstructor: true, name: 'Joe', roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'instructor'})]})}),

http://jsbin.com/vavikuka/1/edit

于 2014-05-22T17:33:21.087 に答える