1

DS.FixtureAdapterを使用して(現在のマスターを使用して)残り火データのジャスミンテストを実行しようとしています。私は以下のコードで何十ものバリエーションを試しました(アプリケーション名前空間を作成しようとした場合としない場合)。また、ember-dataソースにアクセスして、何が起こっているのかを確認し、例としてember-data自体のテストを参照しました。

また、Ember.runブロックとJasmine wait()を使用して、Person.find(1)のバリエーションを試しました。

何をしようとしてstore.find(Person, 'test')も結果を返しますが、属性の1つを取得しようとするとnullになります(テストアサーションは失敗します)。私が見ていないのは何ですか?助けてくれてありがとう!

describe "a test", ->
  store = null
  Person = null

  beforeEach ->

    store = DS.Store.create
      revision: 11
      adapter: 'DS.FixtureAdapter'

    Person = DS.Model.extend
      firstName: DS.attr('string')
      lastName: DS.attr('string')
      age: DS.attr('number')

  it "works or does it", ->
    Person.FIXTURES = [{
      id: 'test'
      firstName: 'Kyle'
      lastName: 'Stevens'
      age: 30
      }]

    kyle = store.find(Person, 'test')
    expect(Em.get(kyle, 'firstName')).toEqual('Kyle')
4

1 に答える 1

3

何をしようとしても、store.find(Person、'test')は結果を返しますが、属性の1つを取得しようとするとnullになります(テストアサーションは失敗します)。私が見ていないのは何ですか?助けてくれてありがとう!

これはタイミングの問題です。呼び出すstore.find()と、非同期でクエリが実行され、モデルの約束が返されます。これは、コントロールがテストに戻ったときにクエリがまだ実行されている(または実行がスケジュールされている)ことを意味し、期待に失敗します。

これは私たちが残り火について気に入っていることです。つまり、アプリはkyleをデータが存在するかのように扱い、データが利用可能になったときにバインディングを介して値が自動的に更新されることを信頼できます。

もちろん、テストに合格するのを妨げている場合、この魔法はそれほど素晴らしいものではありません。いくつかの代替アプローチがあります:

1)didLoadコールバックを登録する

kyle = store.find(Person, 'test');
kyle.on('didLoad', function() {
  console.log('should = kyle: ', Em.get(kyle, 'firstName'));
});

2)didLoadより多くのブラックボックステストアプローチを使用して、findを呼び出してから100ミリ秒以内に名前が適切に設定されていることを確認する代わりに-もちろん、これは脆弱なテストにつながる可能性がありますEmber.run.later(this、function(){console.log ('should = kyle:'、Em.get(kyle、'firstName')); console.log('should = kim:'、Em.get(App.kim、'firstName'));}、100);

ジャスミンテストでは、セットアップコードをruns()メソッドでラップwaitsForし、値が期待どおりに設定されていることを確認するために使用できると思います。

  waitsFor(function() {
    return Em.get(kyle, 'firstName') == 'Kyle';
  }, "x to be set to 5", 100);

動作する(ジャスミン以外の)例については、このJSBINを参照してください:http: //jsbin.com/apurac/4/edit

jasmineを使用した非同期テストのヒントについては、次の投稿を参照してください:http: //blog.caplin.com/2012/01/17/testing-asynchronous-javascript-with-jasmine/

また、必ずEmber.testing = trueすべてのテストに設定してください。詳細については、このSOの投稿を参照してください。単体テストにEmber.testing = trueを設定することをお勧めしますか?

于 2013-01-20T07:34:45.127 に答える