3

これを使用して:

DEBUG: -------------------------------
DEBUG: Ember      : 1.5.1
DEBUG: Ember Data : 1.0.0-beta.7.f87cba88
DEBUG: Handlebars : 1.3.0
DEBUG: jQuery     : 1.10.2
DEBUG: -------------------------------

Ember-qunit を使用したテスト。

そのため、モデルの計算されたプロパティの単体テストを作成しようとしています。計算されたプロパティは、hasMany 関係からのデータに依存します。

したがって、私のモデルは次のようになります。

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

そして、私のテストは次のようになります。

moduleForModel('user', 'Course Model', {
  needs: ['model:role']
});

test('isInstructor - user is an Instructor', function() {
  var user = this.subject({
    id: 1,
    name: 'Joe'
  });

  Ember.run(function(){
    user.set('roles.content', Ember.ArrayProxy.create({content: []}));
    var role = Ember.ObjectProxy.create({name: 'instructor'});
    user.get('roles.content').pushObject(role);
  });

  var value = user.get('isInstructor');
  equal(value, true, "expected true but was " + value);
});

pushObject を実行しようとすると、次のエラーが発生します。

Uncaught TypeError: undefined is not a function ember-data.prod.js?body=1:4284

参照している ember-data の行は次のとおりです。

var inverse = childType.inverseFor(this.firstRecordName);

今、私はいくつかの異なることを試しましたが、まだ運がありません.

まず、一度に作成してみました。

var user = this.subject({
  id: 1,
  name: 'Joe',
  roles: Ember.ArrayProxy.create({content: [Ember.ObjectProxy.create({name: 'instructor' })]})
});

しかし、それは次のように機能しません。

Uncaught Error: Cannot set read-only property "roles" on object: <App.User:ember792:1>

そこで、後で Ember.run ループでロールを設定してみました。

user.set('roles',
  Ember.ArrayProxy.create({
    content: [
      Ember.ObjectProxy.create({
        name: 'instructor'
      })
    ]
  })
);

そして、同じ読み取り専用エラーが発生します。

そこで、ロールと同時にコンテンツを設定してみました:

user.set('roles.content',
  Ember.ArrayProxy.create({
    content: [
      Ember.Object.create({
        name: 'instructor'
      })
    ]
  })
);

そして、私は

Uncaught TypeError: undefined is not a function

だから今、私は上で定義したコードに行きます:

user.set('roles.content', Ember.ArrayProxy.create({content: []}));
var role = Ember.ObjectProxy.create({name: 'instructor'});
user.get('roles.content').pushObject(role);

そして TypeError を取得します。私は途方に暮れています。何が間違っているのか、バグがあるのか​​ わかりません。

私より賢い人はいますか?

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

ありがとう!

** 更新 1 **

kingpin2kが彼の答えで言っていることを見て、私は自分のアプリで自分の残り火のソースを見ました私は ruby​​gem ember-sourceを使用しているので、@kingpin2k が使用した「デバッグ」バージョンとほぼ同じソースを使用しています。ember-source バージョンにはいくつかの追加機能がありますが、すべてのテスト ヘルパーはまだそこにあります。

だから私は自分のコードを見始めました。ポップアップするエラーは、逆の関係に関係しています。

var inverse = childType.inverseFor(this.firstRecordName);

そして、私のjsbinを見て、ロールモデルにbelongsTo('user')

@kingpin2k が使用したのと同じ ember ソースを使用した失敗した jsbin http://jsbin.com/bidus/2/を次に示します。ロールモデルの属している関係が原因で失敗しています。ユーザーを知る必要がある役割は必要ないので、そこにあるべきではないことに気付きました。したがって、その関係を削除すると、すべてが緑色になりました。

これで、@ kingpin2k と同じjsbin http://jsbin.com/bidus/3/が渡されました。

しかし、それは、なぜその belongsTo がそれを barf にしているのかという疑問を投げかけます。私が知る限り、そこにいれば問題ないはずです。多分@kingpin2kこれについてもっと光を当てることができますか?Ember は自分でそれを理解できると思われるため、モデルの役割に逆を追加する必要はありません (そして、キックとクスクスのために追加しようとしましたが、コードはまだバーフです)。私は、ember-data ソースにバグがあると考えがちです。

4

1 に答える 1

3

正直なところ、私が目にする主な問題は、製品版の ember を使用していて、テスト ヘルパーやメソッドが含まれていないことだと思いますsetupForTesting

Ember のデバッグ バージョン

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

クリーナーバージョン

test('isInstructor - user is an Instructor', function() {
  var user = this.subject({
    id: 1,
    name: 'Joe'
  });

  Ember.run(function(){
    user.get('roles').pushObject(Em.Object.create({name:'instructor'}));
  });

  var value = user.get('isInstructor');
  equal(value, true, "expected true but was " + value);
});

http://jsbin.com/tuvoleqo/2/edit

于 2014-05-22T05:30:01.883 に答える