2015-04-20 10 views
10

Według the blog-post dla ember-data wersji 1.0.0-beta.16 sklepu mogą być teraz używane jako usługa:Jak mogę polegać na sklepie jako usłudze w testach jednostkowych Ember przy użyciu qunit?

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

Jednak nie mogę dowiedzieć się, jak to zrobić qunit testy jednostkowe na takiego składnika. Próbowałem następujące:

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

oraz:

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

I kiedy zrobić byłego pojawia się błąd Attempting to register an unknown factory: 'service:store' i jeśli robię ten ostatni następnie store jest undefined.

Myśli?

(Piszę aplikację w stylu w stylu ember-cli).

Aktualizacja:

Wydaje Jest takie open issue za to w repo Ember-test-pomocników.

A ja czekam na ten problem, ja gotowane pomocnika, który może pracować jako środek stop-gap (coffeescript):

`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` 

Odpowiedz

12

Test jednostka jest miejscem, gdzie wszystko działa doskonale z wyjątkiem kod/komponent/urządzenie, które testujesz.

Należy założyć, że nawet store działa idealnie (0 błędów/błędów).

Coś jak to powinno działać w teście:

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

Jeżeli części swoich badań zależy od danych pobranych ze sklepu, można zrobić coś takiego:

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

Ma to na celu zachowanie status "testu jednostkowego", jeśli zaczniesz włączać i rejestrować inne obiekty z aplikacji, faktycznie będziesz pisać testy integracji.

Uwaga:

Ogólnie patrząc modele bezpośrednio w komponencie jest anty-wzorzec i powinny wolisz zdać w każdym modelu trzeba w szablon, który dołączony komponent.

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

+0

Testy akceptacyjne są nieznośnie wolno. Wolę używać ich tylko wtedy, gdy testuję wiele aspektów aplikacji. Jeśli testuję dokładnie dwie części, to ma sens tylko tworzenie tych dwóch elementów i testowanie ich razem, ale w oderwaniu od reszty aplikacji. –

+1

Jestem świadomy wątku, o którym wspomniałeś, i doceniam tę radę, ale jestem w obozie, który odczuwa pewne ograniczone, odpowiednie zastosowania, aby umożliwić dostęp do sklepu wewnątrz pewnych komponentów.W szczególności, gdy stan reprezentowany w komponencie nie pochodzi z adresu URL, ale raczej wewnętrzny i izolowany aspekt komponentu, może mieć sens izolowanie tego stanu w komponencie i nie zanieczyszczanie wszystkich tras zawierających element z logika wymagana do utworzenia instancji modeli i zaktualizowania ich jako stanu wewnętrznego względem zmian komponentów. –

+0

Uzgodnione, masz dobry punkt. Nawet wtedy, w tym typie testu (twój komponent), to, co testujesz, to logika komponentu, a nie sklep. Więc tak naprawdę nie ma znaczenia, skąd pochodzą dane. To, co test musi zrobić, to sprawdzenie, czy różne elementy danych wyzwalają prawidłowe zdarzenia i powodują oczekiwane wyniki. – givanse

Powiązane problemy