2016-04-19 27 views
12

Nach einer Beispielanwendung zu erzeugen:Instanz initializer Einheit Test nicht mit "Speicher ist nicht definiert"

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

Mit den folgenden Dateien:

model/Test-data.js

import DS from 'ember-data'; 

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

Routen/index.js

import Ember from 'ember'; 

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

instanz initializers/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> 

Adapter/application.js

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

export default RESTAdapter.extend({}); 

ember serve führt die Anwendung und zeigt die Vorbelastungsdaten, sondern für die preload Instanzeninitialisierung zu /tests den Standard Unit-Test geht nicht mit dem Fehler store is undefined.

Vollfehlermeldung:

Died on test #1 @http://localhost:4200/assets/tests.js:212:1 
[email protected]://localhost:4200/assets/vendor.js:94:20 
[email protected]://localhost:4200/assets/vendor.js:142:5 
findModule[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 

Wie initialisieren ich das Geschäft der Anwendung, so dass es in der Unit-Test verwendet werden?

Bearbeiten - Tests/Einheit/Instanz-Initialisierer/Preload-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); 
}); 

es versucht, mit needs: [ 'service:store' ] und ohne (obwohl sie vorgeschlagen, dass Sie should not need to do this wenn Ember-Daten auf der Seite - was ich auch versucht habe, sowohl im Komponententest als auch im Instanzinitialisierer zu importieren).

Versionen:

Ember  : 2.4.5 
Ember Data : 2.5.2 
+0

Haben Sie getestet, um 'service: store' als Abhängigkeit in Ihrem Komponententest über' needs' zu definieren? – jelhan

+0

@jelhan Ja, habe es mit 'needs: ['service: store']' und (wie [hier vorgeschlagen] versucht (https://github.com/embers/data/issues/2994#issuecomment-99615466)) habe versucht, 'ember-data' zu importieren und versucht herauszufinden, wie man den Speicher auf der neuen Instanz erstellt, aber ohne Erfolg. – MT0

Antwort

7

Bei Unit-Test einer Instanz-Initialisierer, brauchen Sie nicht wirklich store Service zu erhalten. Verwenden Sie in solchen Fällen lieber Scheindienste. Das Verhalten der Instanz-Initialisierer ist einige Daten in den Laden zu bringen, die durch Anwendung vorgesehen ist. Sie können diesen Laden leicht verspotten.

Beispiel Testcode mit mock-Service:

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()); 
}); 

Zweite Option

Natürlich können Sie auch als unter den appInstance Paramater der initialize Funktion verspotten:

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()); 
}); 

Aber Ich bevorzuge den ersten zu verwenden. Wir haben angegeben, dass das Verhalten Ihrer Instanz-Initialisierer wie einige Daten in den Speicher, der von der Anwendung bereitgestellt wird, zu versetzen. Aber in der zweiten Option, es scheint, dass wir auch überprüfen, dass Ihre Instanz-Initialisierer ist Aufruf der Lookup-Funktion von appInstance auch. Dieser Test ist stärker an Ihre Implementierungsdetails gekoppelt.