2017-03-19 3 views
0

{{deferred-content}}コンポーネントは、モデルオブジェクトのassetリレーションにフックされたコンポーネントのテンプレート内にあります。Ember統合テスト+リレーションシップ+ ember-deferred-contentアドオンを使用したモックモデル

{{#unless showUploadForm}} 
    {{#deferred-content contentBlock.asset as |d|}} 
    {{#d.fulfilled as |asset|}} 
     {{#if asset.asset.isProcessing}} 
     {{! Show processing message here }} 
     {{/if}} 
    {{/d.fulfilled}} 
    {{/deferred-content}} 
{{/unless} 

showUploadForm計算プロパティが重要である:ここで私は何をしようとしているの削ぎ落としたバージョンがあり、開発モードと本番で自分のアプリケーションからの見事

showUploadForm: computed('contentBlock.asset', 'isReplacing', function() { 
    console.log(this.get('contentBlock.asset.id')); 
    return this.get('isReplacing') || isBlank(this.get('contentBlock.asset.id')); 
}) 

このすべての作品モードなど、すべてAPIにフックされています。私は統合テストを記述しようとすると、

その後、我々はトラブルタウンを入力します。

test('it displays processing message when asset is loaded in with processing status', function(assert) { 
    let deferred = RSVP.defer(); 

    this.set('contentBlock', Ember.Object.create({ 
    asset: deferred.promise 
    })); 

    this.render(hbs`{{asset-editor contentBlock=contentBlock}}`); 

    // This is likely the big fat problem. I don't know what to put here. 
    deferred.resolve(Ember.Object.create({ 
    id: 'the-id', 
    asset: { 
     isProcessing: true 
    } 
    })); 

    let done = assert.async(); 

    return wait().then(() => { 
    // Stuff I'm asserting is here. It fails because the 
    // `showUploadForm` computed property is returning `true`. 
    done(); 
    }); 
}); 

興味深い部分は、私は上記の共有計算されたプロパティです。開発/生産では、私はidを取得します。テストでは、私はundefinedを取得します。

この問題は、Ember Dataが約束を処理していることと、受け取ったデータを解決した後に「アンパック」するオブジェクトが原因であることが確かです。問題は、私の統合テストでこれをどうやって模倣するのか分かりません。

deferred.resolveを呼び出して、アプリケーションがモデルの関係として値を扱うように設定することができるものは特にありますか?

ボーナス笑いについて、Iは、試験にエンバーミラージュを引っ掛けcontentBlock(関連するデータサイドロードし、後でないとの両方)を取得するstoreサービスを照会し、試験にcontentBlockようにそれを設定しますコンテキスト。私は同様の結果を得た。

+0

解決策は受け入れテストに移行することですか?私がコンポーネントテスト以上に好きなのはただ1つだけです。それは受け入れテストです。 –

+0

オブジェクトが 'contentBlock'オブジェクトに変更を通知していたのであれば修正してもらえますか?私の推測では、約束がコンテンツを変更しているとは見えません。 –

答えて

0

私は最終的に、インテグレーションテストの代わりに受け入れテストでこれを動作させました。私がその文脈で機能性の多くをテストすることができないので、コンポーネントテストが不完全なように見えるので、これは私と100%良く一致しません。つまり、この問題は、コンポーネントをより小さなコンポーネントに分割することを検討することにも挑戦しているので、特殊ロジックの一部を分離してテストしやすくなりました。それで、データがどのようにロードされたか(関係との直接的または非同期的な関係など)について心配することなく、個々のコンポーネントの機能をテストできます。

アクセプタンステストでは、これらの小さなコンポーネントの全体的な統合をテストすることができます。

関連する問題