1

Ember モデルをテストするために Qunit テストを書いていますが、リレーションの依存関係 (計算されたプロパティが別のモデルの計算されたプロパティをトリガーする) を持つ計算されたプロパティをテストするのに苦労しています。

テスト中のモデル (CoffeeScript):

Customer = DS.Model.extend
  firstName:      DS.attr('string')
  lastName:       DS.attr('string')
  phones:         DS.attr('embedded-list')
phone: (->
    @get('phones.firstObject.number')
  ).property('phones.firstObject.number')

fullName: (->
    [@get('lastName'), @get('firstName')].join(' ') )
  ).property('firstName','lastName')

会議モデル:

Meeting = DS.Model.extend
  customers: DS.hasMany('customer')

  startAt:   DS.attr('isodate')
  status:    DS.attr()
  objective: DS.attr()

 customerPhones: (->
    phones = []
    @get('customers').forEach (c) ->
      c.get('phones').forEach (ph) ->
        phones.push(ph.number)
    phones
  ).property('customers.@each.phones')


  firstCustomer: (->
    @get('customers.firstObject')
  ).property('customers.firstObject')

 firstCustomerFullName: (->
    @get('firstCustomer.fullName')
  ).property('firstCustomer.fullName')

今、テストcustomerPhonesfirstCustomerFullNameていて、本当に苦労しています...

私のテストは次のようになります。

`import { test, moduleForModel } from 'ember-qunit';`

moduleForModel('meeting', 'App.Meeting',{
   needs: ['model:customer']
   setup: ->
     Ember.run do (t = @)->
       ->
        customer = t.store().createRecord 'customer', firstName: 'John', lastName: 'Smith', phones:[]
        customer.get('phones').addObject(Ember.Object.create({tag: 'home', number: '111222333'}))
        customer.get('phones').addObject(Ember.Object.create({tag: 'work', number: '444555666'}))

        t.subject().set('customers.content', Ember.ArrayProxy.create({content: []}));
        t.subject().get('customers.content').pushObject(customer)    
 teardown: ->
  },(container, context) ->
      container.register 'store:main', DS.Store
      container.register 'adapter:application', DS.FixtureAdapter
      context.__setup_properties__.store = -> container.lookup('store:main')
)

test "it's a DS.Model", -> ok(@subject())

test "attributes: can be created with valid values", ->
  meeting = @subject({objective: 'Follow up'})
  Ember.run ->
    equal(meeting.get('objective', 'Follow up'))


test "properties: firstCustomer & firstCustomerFullName & firstCustomerPhone", ->
  meeting = @subject()
  Ember.run ->
    equal(meeting.get('firstCustomer.fullName'),  'Smith John')
    equal(meeting.get('firstCustomer.phone'),     '111222333')

ここで、このテストでいくつかの手法を使用しました。これは、Stack Overflow の回答で見つけましたが、今は見つけられないようです。

数日前は完全に機能していましたが、今では(私が知っているのはナンセンスに思えます)テストを実行するたびにエラーになります:

アサーションに失敗しました: この関係に「ミーティング」レコードを追加することはできません (「ミーティング」のみが許可されます)

エラーの場所も、修正方法もわかりません。一日中遊んでいて、結果はありません。

どうすればこれを解決できますか?

4

2 に答える 2

2

さて、これまでのところ、コメントするには多すぎるので、WIP Answer を行います。

  • 実行ループのほとんどを削除しました。これらは非同期プロセスにのみ必要です。

  • 計算されたプロパティの一部をプロパティに変更しましcomputed.alias

すなわち

phone: (->
  @get('phones.firstObject.number')
).property('phones.firstObject.number')

phone: Ember.computed.alias('phones.firstObject.number')
  • 私はほとんどのセットアップを取り除きました。Ember Data は熱心にストアを独自にロードし、それを指定せずにフィクスチャ ID などを使用します。(この部分は元に戻すことができますが、このコンテキストでは必要ありません)。

すなわち

  },(container, context) ->
  container.register 'store:main', DS.Store
  container.register 'adapter:application', DS.FixtureAdapter
  context.__setup_properties__.store = -> container.lookup('store:main')
  • 前もってお詫び申し上げます。私はcoffeescriptのファンではないので、すべてjsに入れました。問題は、まだ問題が発生している場合は、使用している Ember、ED、および Ember Qunit のバージョンを確認する必要があるかもしれないということです。

http://emberjs.jsbin.com/OxIDiVU/625/edit

于 2014-06-09T16:54:34.463 に答える
1

「hasMany を使用する計算されたプロパティを単体テストする方法」を探しているこの質問を見つけました。

これは私がそれをどのように行ったかの簡単な例です(Kitlerに感謝します):

冷蔵庫モデル:

foods: DS.hasMany('food', {async: true}),

inDateFoods: Ember.computed('foods.@each.{ignoreEndDate,endDate}', function() {
  let foods = this.get('foods');
  let now = moment();
  return foods.filter(f => f.get(ignoreEndDate) || moment(c.get('endDate')).isAfter(now));
})

それでは、単体テストで inDateFoods をテストしたいとしましょう。次に、冷蔵庫モデルのテスト ファイルで次のようにします。

import Ember from 'ember';
import { moduleForModel, test } from 'ember-qunit';
import Fridge from '../../../models/fridge';

Fridge.reopen({
  foods: Ember.computed(() => [])
});

moduleForModel('fridge', 'Unit | Model | fridge', {
  // Specify the other units that are required for this test.
  needs: ['model:food']
});

test('filters correctly', function(assert) {
  assert.expect(1);
  let model = this.subject();
  model.pushObject(Ember.Object.create({foods: [{id: 1, ignoreEndDate: false, endDate: '2050-03-08T00:00:00'});

  assert.equal(model.get('inDateFoods.length'), 1);
});

ここで重要なのは、モデルを再度開いて has many を削除し、実行後にオブジェクトをプッシュすることthis.subjectです。再開する前に、エラーが発生していましAll elements of a hasMany relationship must be instances of DS.Model, you passed [[object Object]] errorた。

于 2016-04-14T15:26:33.397 に答える