2015-04-20 6 views
10

Nach the blog-post für ember-data Version 1.0.0-beta.16 der Speicher kann nun als Service genutzt werden:Wie kann ich den Shop als Dienst in Ember-Unit-Tests mit qunit verwenden?

TweetComposerComponent = Ember.Component.extend({ 
    store: Ember.inject.service()  
}); 

Allerdings habe ich nicht herausfinden kann, wie man auf einer solchen Komponente qunit Unit-Tests zu tun. Ich habe versucht, die folgenden:

moduleForComponent('tweet-composer', { 
    needs: ['service:store'] 
}); 

und:

moduleForComponent('tweet-composer', { 
    needs: ['store:main'] 
}); 

Und wenn ich tun, um die ehemalige ich einen Fehler Attempting to register an unknown factory: 'service:store' und wenn ich das letztere tun dann store ist undefined.

Gedanken?

(Ich schreibe eine Stil App).

Update:

Es scheint, gibt es eine open issue hierfür in den glühenden Kohlen-Test-Helfer Repo.

Während ich für dieses Update warte, kochte ich einen Helfer auf, die als eine Notlösung (Coffee) arbeiten können:

`import TestModuleForComponent from 'ember-test-helpers/test-module-for-component'` 
`import { createModule } from 'ember-qunit/qunit-module'` 

# This assumes the last argument, the callbacks, is present, although it 
# does support the description being an optional argument. 
moduleForStoreComponent = -> 
    args = Array.prototype.slice.call arguments 
    callbacks = args[args.length-1] 
    # Wrap the original beforeEach callback in a modified version that 
    # also sets up the store for the test container. 
    originalSetup = callbacks.beforeEach 
    callbacks.beforeEach = -> 
    DS._setupContainer(@container) 
    originalSetup.call(@) if originalSetup 
    callbacks.store = -> 
    @container.lookup('store:main') 
    args.unshift TestModuleForComponent 
    createModule.apply @, args 

`export default moduleForStoreComponent` 

Antwort

12

Ein Unit-Test ist ein Ort, an dem alles perfekt außer das funktioniert Code/Komponente/Einheit, die Sie testen.

Also sollte auch die store perfekt funktionieren (0 Fehler/Bugs).

So etwas sollte in Ihrem Test arbeiten:

moduleForComponent('tweet-composer', { 
    beforeEach: function() { 
     this.subject({ 
      store: {/*empty object*/} 
     }); 
    } 
}); 

Wenn Teile Ihrer Tests auf Daten aus dem Speicher abgerufen abhängen, können Sie wie etwas tun:

this.subject({ 
    store: { 
     find: function() { 
      var mockedModel = Ember.Object.create({/*empty*/}); 
      return mockedModel; 
     } 
    } 
}); 

Dies ist zu erhalten den Status von "Unit Test", wenn Sie andere Objekte aus Ihrer App einbinden und registrieren, schreiben Sie tatsächlich Integrationstests.

Hinweis:

Im Allgemeinen Modelle direkt in einer Komponente aufzublicken ist ein anti-Muster, und Sie sollten in jedem Modell Sie die Vorlage in müssen passieren bevorzugen, der die Komponente enthalten.

http://discuss.emberjs.com/t/should-ember-components-load-data/4218/2?u=givanse

+0

sind Abnahmen quälend langsam. Ich bevorzuge es, sie nur zu verwenden, wenn ich viele Aspekte der Anwendung teste. Wenn ich genau zwei Stücke teste, ist es viel sinnvoller, nur diese beiden Teile zu instantiieren und sie zusammen zu testen, aber isoliert vom Rest der App. –

+1

Ich kenne den Thread, den Sie erwähnen, und ich schätze den Rat, aber ich bin im Lager, das glaubt, dass es bestimmte eingeschränkte, angemessene Verwendungen gibt, um den Ladenzugriff innerhalb bestimmter Komponenten zu ermöglichen.Insbesondere wenn der in der Komponente dargestellte Zustand nicht von der URL abgeleitet wird, sondern ein intrinsischer und isolierter Aspekt der Komponente, kann es sinnvoll sein, diesen Zustand in der Komponente zu isolieren und nicht alle Routen zu verschmutzen, die die Komponente kennzeichnen die Logik, die erforderlich ist, um die Modelle zu instanziieren und sie zu aktualisieren, während sich der interne Zustand der Komponente ändert. –

+0

Einverstanden, Sie haben einen guten Punkt dort. Selbst bei dieser Art von Test (Ihrer Komponente) testen Sie die Logik der Komponente und nicht den Speicher. Es spielt also keine Rolle, woher die Daten kommen. Der Test muss sicherstellen, dass verschiedene Daten die richtigen Ereignisse auslösen und zu erwarteten Ergebnissen führen. – givanse

Verwandte Themen