2017-08-08 4 views
1

Ich habe eine Komponente, die this.get('model.property') verwendet, und es funktioniert wie vorgesehen.Ember.js + Mirage: eine verhasste Beziehung in Integrationstest

Für meine Integrationstests ich Mirage bin mit, die für alle meine anderen Tests (Integrationstests enthalten), aber gearbeitet hat, als ich diese bestimmte Komponente testen ich:

TypeError: Cannot read property 'then' of undefined

Dies ist, was mein Test wie folgt aussieht:

import { moduleForComponent, test } from 'ember-qunit' 
import hbs from 'htmlbars-inline-precompile' 
import { startMirage } from 'app/initializers/ember-cli-mirage' 
import Ember from 'ember' 

moduleForComponent('summary-card', 'Integration | Component | summary card', { 
    integration: true, 
    beforeEach() { 
    this.server = startMirage() 
    }, 
    afterEach() { 
    this.server.shutdown() 
    } 
}) 

test('it renders', function(assert) { 
    const customer = this.server.create('customer') 
    const location = this.server.create('location', { customer }) 
    const manufacturer = this.server.create('manufacturer') 
    const model = this.server.create('device-model', { manufacturer }) 
    this.server.createList('device', 5, { model, customer, location }) 

    const loc = Ember.Object.create(location) 
    this.set('model', loc) 
    this.render(hbs`{{summary-card model=model model-name=model.name tag='location' belongs-to='customer' has-many='device'}}`); 

    assert.equal(this.$('h1').text().trim(), 'Location 0', 'should be titled Location 0') 

}); 

Und im Grunde, mein summary-card.js so etwas wie dieses hat:

this.get('model.' + belongs).then(relationship => {...}) 

Dabei ist belongs einfach der Wert von allem, auf den belongs-to eingestellt ist, wenn die Komponente aufgerufen wird.

Ich bin ein wenig verwirrt, da es scheint, dass das Modell, das ich an meinen Test übergebe, nicht wirklich das Modell auf die gleiche Weise darstellt wie bei der Ausführung ember s (Ich benutze Mirage für Entwicklungszwecke auch). Gibt es irgendwo wo ich mehr darüber erfahren kann, was genau dort vor sich geht?

Vielen Dank!


P.S. Ich habe auch das location Objekt zu verwenden versucht, wie von server.create() zur Verfügung gestellt, und ich bekomme eine etwas andere Fehler:

TypeError: _this.get(...).then is not a function

Antwort

1

Nun, durch this answer Lesen konnte ich meine eigene Lösung finden, die wirklich funktioniert gut:

import { moduleForComponent, test } from 'ember-qunit' 
import hbs from 'htmlbars-inline-precompile' 
import Ember from 'ember' 

moduleForComponent('summary-card', 'Integration | Component | summary card', { 
    integration: true 
}) 

test('it renders', function(assert) { 
    this.inject.service('store', {as: 'store'}) 
    let location 

    Ember.run(() => { 
    location = this.store.createRecord('location', { 
     id: 0, 
     name: 'Location 0', 
     customer: this.store.createRecord('customer', { 
     id: 1, 
     name: 'Customer 0' 
     }), 
     devices: [this.store.createRecord('device', {id: 1})] 
    }) 
    }) 

    this.set('model', location) 
    this.render(hbs` 
    {{#summary-card model=model model-name=model.name tag='location' belongs-to='customer' has-many='device'}} 
     <div class='test-content'>Test Content</div> 
    {{/summary-card}} 
    `) 

Grundsätzlich habe ich für die Verwendung der Speicher direkt entschieden haben, anstatt mit Mirage, und es funktioniert!

Verwandte Themen