2014-12-14 13 views
6

Sto provando a fare un test di base "funziona" per un Mixin che deve essere utilizzato con un Modello. Suppongo che l'approccio al test unitario debba essere fatto non sul Mixin stesso ma su una generica classe di modello con questo mixin miscelato.Unit test a Model Mixin

Supponendo che questa prima ipotesi/strategia abbia senso, ecco cosa ho provato a fare:

import DS from 'ember-data'; 
import Ember from 'ember'; 
import DictionaryManagerMixin from 'trainer/mixins/dictionary-manager'; 

module('DictionaryManagerMixin'); 

test('it works', function() { 
    var DictionaryManagerModel = DS.Model.extend(DictionaryManagerMixin, { 
     title: DS.attr('string') 
    }); 
    var myStore = DS.Store.create(); 
    var subject = myStore.createRecord(DictionaryManagerModel); 
    ok(subject); 
}); 

Questo non funziona, dando il seguente errore:

TypeError: Cannot read property 'lookup' of undefined 
    at null.<anonymous> (http://localhost:4200/assets/vendor.js:95610:35) 
    at Descriptor.ComputedPropertyPrototype.get (http://localhost:4200/assets/vendor.js:28466:25) 
    at get (http://localhost:4200/assets/vendor.js:33944:21) 
    at Ember.Object.extend.adapterFor (http://localhost:4200/assets/vendor.js:97005:27) 
    at Ember.Object.extend._generateId (http://localhost:4200/assets/vendor.js:95682:28) 
    at Ember.Object.extend.createRecord (http://localhost:4200/assets/vendor.js:95654:32) 
    at Object.eval (trainer/tests/unit/mixins/dictionary-manager-test.js:17:28) 
    at Object.Test.run (http://localhost:4200/assets/test-support.js:2632:18) 
    at http://localhost:4200/assets/test-support.js:2719:10 
    at process (http://localhost:4200/assets/test-support.js:2435:24) 

Qualsiasi aiuto sarebbe molto apprezzato.

+0

Sto facendo lo stesso, ma utilizzando il mixin come unità da testare invece di testare il modello. Se usi ember-cli, quando generi "mixin" crea il test per te – leojh

risposta

0

Solitamente lookup richiede un contenitore, quindi questo è un suggerimento per quello che sto pensando sta causando il problema. Questo ha senso perché DS si basa su un contenitore per poter cercare i modelli registrati su model:model-name;

Quindi la dipendenza di test per questo mixin è veramente su Dati di Ember configurati correttamente. Quindi, se si esegue il test in modo che funzioni per un modello di Ember Data, il mixin più o meno va a posto con l'impostazione dell'oggetto come previsto.

direi provare a utilizzare moduleForModel, dal utile Ember doc:

moduleForModel('dictionary-manager-model'); 

test('your test here', function(assert) { 
    // this.subject aliases the createRecord method on the model 
    const dictionaryManagerModel = this.subject(); 
}); 

Avete bisogno di condizionale rotolo nella mixin con il modello? Se il tuo modello usa sempre il mixin, puoi farlo nel file di definizione del modello e testarlo come mostrato sopra. Nel tuo esempio viene aggiunto il mixin al modello e il modello viene passato a createRecord`, ma questo non è incoraggiato:

https://github.com/emberjs/data/blob/v2.14.10/addon/-private/system/store.js#L351 assert( Passando classi per memorizzare metodi è stato rimosso. Si prega di passare una stringa dasherizzata invece di $ {modelName} , typeof modelName === 'string'); che è il motivo per cui ci affidiamo alla ricerca sul container.

In sostanza, penso che tu sia dopo un test del modello, non un test di mixaggio. A meno che il mixin non possa essere trasformato in qualcosa che non sia un modello e funzioni ancora.

ember generate model-test dictionary-manager-model se non esiste già, e quindi il file di modello ha già mixato il mixin. Inoltre, forse questo non ha bisogno di essere un mixin separato?

Spero che questo ti faccia iniziare nella giusta direzione, evviva! ✌