2016-04-19 31 views
12

Dopo aver generato un'applicazione esempio:grado unit test inizializzatore fallisce con "store è definito"

ember new preloadtest 
cd preloadtest/ 
ember g instance-initializer preload 
ember g model test-data 
ember g route index 
ember g adapter application 

Con i seguenti file:

modelli/provini data.js

import DS from 'ember-data'; 

export default DS.Model.extend({ 
    name: DS.attr('string'), 
    value: DS.attr('number') 
}); 

percorsi/index.js

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model(){ 
    return this.store.peekAll('test-data'); 
    } 
}); 

esempio-inizializzatori/preload.js

export function initialize(appInstance) { 
    let store = appInstance.lookup('service:store'); 
    store.pushPayload({ "testDatas": [ 
    { "id": 1, "name": "aaa", "value": 1}, 
    { "id": 2, "name": "bbb", "value": 2}, 
    { "id": 3, "name": "ccc", "value": 3} 
    ] }); 
} 

export default { 
    name: 'preload', 
    initialize 
}; 

templates/index.hbs

<ul> 
{{#each model as |td|}} 
    <li>{{td.name}}: {{td.value}}</li> 
{{/each}} 
</ul> 

adattatori/application.js

import RESTAdapter from 'ember-data/adapters/rest'; 

export default RESTAdapter.extend({}); 

ember serve esegue l'applicazione e visualizza i dati di precarico ma passa a /tests il test dell'unità predefinito per l'inizializzatore dell'istanza non riesce con l'errore store is undefined.

messaggio di errore completo:

Died on test #1 @http://localhost:4200/assets/tests.js:212:1 
Module.prot[email protected]://localhost:4200/assets/vendor.js:94:20 
[email protected]://localhost:4200/assets/vendor.js:142:5 
find[email protected]://localhost:4200/assets/vendor.js:193:5 
[email protected]://localhost:4200/assets/vendor.js:181:12 
[email protected]://localhost:4200/assets/test-loader.js:67:9 
[email protected]://localhost:4200/assets/test-loader.js:58:13 
[email protected]://localhost:4200/assets/test-loader.js:89:7 
@http://localhost:4200/assets/test-support.js:6397:5 
: store is [email protected] 114 ms 
Source:  

[email protected]://localhost:4200/assets/preloadtest.js:213:5 
@http://localhost:4200/assets/tests.js:213:1 
[email protected]://localhost:4200/assets/test-support.js:2716:14 
[email protected]://localhost:4200/assets/test-support.js:2701:4 
run/<@http://localhost:4200/assets/test-support.js:2843:6 
[email protected]://localhost:4200/assets/test-support.js:2502:4 
[email protected]://localhost:4200/assets/test-support.js:2484:2 
resumeProcessing/<@http://localhost:4200/assets/test-support.js:2544:4 

Come posso inizializzare negozio dell'applicazione in modo che possa essere utilizzato nel test di unità?

Modifica - test/unit/istanza-initializers/precarico-test.js

import Ember from 'ember'; 
import { initialize } from 'preloadtest/instance-initializers/preload'; 
import { module, test } from 'qunit'; 
import destroyApp from '../../helpers/destroy-app'; 
//import DS from 'ember-data'; 

module('Unit | Instance Initializer | preload', { 
    //needs: [ 'service:store' ], 
    beforeEach: function() { 
    Ember.run(() => { 
     this.application = Ember.Application.create(); 
     this.appInstance = this.application.buildInstance(); 
    }); 
    }, 
    afterEach: function() { 
    Ember.run(this.appInstance, 'destroy'); 
    destroyApp(this.application); 
    } 
}); 

// Replace this with your real tests. 
test('it works', function(assert) { 
    initialize(this.appInstance); 

    // you would normally confirm the results of the initializer here 
    assert.ok(true); 
}); 

provato con needs: [ 'service:store' ] e senza (anche se la sua suggerito che si should not need to do this se Ember-Data è sulla pagina - che ho anche provato a importare sia nel test unitario che nell'inizializzatore di istanze).

Versioni:

Ember  : 2.4.5 
Ember Data : 2.5.2 
+0

Hai provato a definire 'servizio: store' come dipendenza nel test dell'unità tramite' needs'? – jelhan

+0

@jelhan Sì, l'ho provato con 'needs: ['service: store']' e (come [per il suggerimento qui] (https://github.com/emberjs/data/issues/2994#issuecomment-99615466)) ho provato a importare 'ember-data' e ho cercato di capire come creare lo store sulla nuova istanza, ma senza successo. – MT0

risposta

7

Alla prova Unità di un'istanza-inizializzatore, non è necessario per ottenere reali store servizio. In questi casi, preferisci usare i servizi di simulazione. Il comportamento del proprio inizializzatore di istanza è per inserire alcuni dati nell'archivio fornito dall'applicazione. Puoi facilmente prendere in giro quel negozio.

esempio di codice di prova con un servizio finto:

import Ember from 'ember'; 
import { initialize } from 'preloadtest/instance-initializers/preload'; 
import { module, test } from 'qunit'; 
import destroyApp from '../../helpers/destroy-app'; 

//this is the mock store service: 
const storeStubFactory = Ember.Service.extend({ 
    data: null, 
    init(){ 
    this.data = []; 
    }, 
    pushPayload(payload){ 
     this.get('data').pushObject(payload); 
    }, 
    getAllPayloads(){ 
     return this.get('data'); 
    } 
}); 

module('Unit | Instance Initializer | preload', { 
    beforeEach: function() { 
    Ember.run(() => { 
     this.application = Ember.Application.create(); 
     this.appInstance = this.application.buildInstance(); 
     //Register your mock service (do not create instance, use factory) 
     this.appInstance.register('service:store', storeStubFactory); 
    }); 
    }, 
    afterEach: function() { 
    Ember.run(this.appInstance, 'destroy'); 
    destroyApp(this.application); 
    } 
}); 

// This is your real test: 
test('it works', function(assert) { 
    initialize(this.appInstance); 

    // confirm that mock service has the correct payload:  
    assert.ok(this.appInstance.lookup('service:store').getAllPayloads()); 
}); 

Seconda opzione

naturalmente si può anche prendere in giro il appInstance paramater della funzione initialize come di seguito:

import Ember from 'ember'; 
import { initialize } from 'preloadtest/instance-initializers/preload'; 
import { module, test } from 'qunit'; 
import destroyApp from '../../helpers/destroy-app'; 

const storeStubFactory = Ember.Service.extend({ 
    data: null, 
    init(){ 
    this.data = []; 
    }, 
    pushPayload(payload){ 
     this.get('data').pushObject(payload); 
    }, 
    getAllPayloads(){ 
     return this.get('data'); 
    } 
}); 

module('Unit | Instance Initializer | preload'); 

// This is your real test: 
test('it works', function(assert) { 
    let instance = storeStubFactory.create(); 

    initialize({lookup:function(serviceName){return serviceName==='service:store' ? instance : null;}}); 

    // confirm that mock service has the correct payload: 
    assert.ok(instance.getAllPayloads()); 
}); 

Ma Preferisco usare il primo. Abbiamo dichiarato che il comportamento degli inizializzatori di istanza come per inserire alcuni dati nell'archivio fornito dall'applicazione. Ma nella seconda opzione, sembra che stiamo anche controllando che l'inizializzatore di istanza sia chiamando la funzione di ricerca di appInstance. Questo test è più accoppiato ai dettagli della tua implementazione.