2015-05-01 2 views
8

Ich baue eine Ember CLI App (v0.2.3), und ich habe einige Komponententests, die für mich für die Adapter und den Serializer in meiner App generiert wurden. Der generierte Code sieht wie folgt aus:Wie erstellt man Komponententests für Ember.js Adapter/Serialisierer?

// app/serializers/my-model-test.js 

// Replace this with your real tests. 
test('it serializes records', function (assert) { 
    var record = this.subject(); 

    var serializedRecord = record.serialize(); 
    assert.ok(serializedRecord); 
}); 

und

// app/adapter/application-test.js 

// Replace this with your real tests. 
test('it exists', function (assert) { 
    var adapter = this.subject(); 
    assert.ok(adapter); 
}); 

Was ich in diesen Tests setzen? Ich habe Abnahmetests und Komponententests für meine Modelle und Komponenten erstellt, bin mir aber nicht sicher, was in diesen Komponententests erforderlich ist. Ich konnte keine Dokumentation zum Aufbau dieser Komponententests finden, und ich kann auch keine Beispielanwendungen auf GH finden, die diese Tests erstellt haben.

Antwort

14

Wenn Sie Komponententests für Ihre Adapter und Serialisierer erstellen möchten, sollten Sie sich ansehen, wie die Glattendaten diese selbst testen. Grundsätzlich können Sie den Test für die RESTSerializer usw. betrachten und ihre Technik verwenden.

Beispiel Serializer: https://github.com/emberjs/data/tree/master/tests/integration/serializers

Der Code, die glut Daten dies zu erreichen, verwendet: https://github.com/emberjs/data/blob/master/tests/helpers/store.js

+1

defekte Links, Downvoted –

+1

Ty für @omouse zu bemerken. die Links repariert! –

+0

Dies ist der perfekte Kommentar. Danke für die Links und Infos. – transformerTroy

6

Ich fand es viel einfacher, einen Integrationstest für meinen benutzerdefinierten Serializer zu schreiben. Ich habe Steffans Vorschlag versucht, aber ich konnte nichts anderes laden als den Basis-JSONSerializer. Der Code, den ich geschrieben habe und der in Ember 1.13.8, Ember Data 1.13.15 funktioniert, ist unten.

import { moduleFor, test } from 'ember-qunit'; 

moduleFor('application', 'Integration | Serializer | application', { 
    integration: true 
}); 

test('Serializer normalizes correctly for basic single object', function(assert) { 
    assert.expect(1); 
    let store = this.container.lookup('service:store'); 

    var basicPeterJson = { 
    id: 1, 
    title: 'Mr', 
    firstName: 'Peter', 
    lastName: 'Parker' 
    }; 

    var expectedHash = { 
    data: { 
     type: 'contact', 
     id: 1, 
     attributes: { 
     title: 'Mr', 
     firstName: 'Peter', 
     lastName: 'Parker' 
     }, 
     relationships: {} 
    } 
    }; 

    var contact = store.serializerFor('application').normalizeResponse(store, store.modelFor('contact'), basicPeterJson, 1); 

    assert.deepEqual(contact, expectedHash); 
}); 

Ich stellte dies in Tests/Integration/Serializer/my-Serializer-test.js

+2

Ich brauchte 'moduleFor ('serializer: application, ...)' für Ember, um den Serializer zu finden. – meleyal

+0

Im Standard-Serializer-Komponententest haben Sie über 'this.store()' Zugriff auf den Speicher, da 'modulForModel' anstelle von 'moduleFor' verwendet wird. 'SerializerFor' ist jedoch eine private Methode. Ich finde es einfacher, Serialisierer durch den Laden mit etwas wie Pretender zu prüfen und Serialisierer und Adapter als "private" Klassen zu behandeln. – skaterdav85

0

Prüfung der Adapter:

test('it has a url for creating a record', function (assert) { 
    const url = this.subject().urlForCreateRecord('person', { firstName: 'Bob' }); 
    assert.equal(url, 'https://example.com/path/to/api'); 
}); 

Testen der Serializer:

test('it serializes records', function (assert) { 
    const serialized = this.subject({ 
    foo: 'bar', 
    }).serialize(); 

    assert.equal(serialized.foo, 'bar'); 
}); 

Zum Testen anderer Serialisierungsfunktionen habe ich vorher @ Knightsys Integrationstestbeispiel verfolgt und es hat für mich funktioniert . Danke vielmals! Dann habe ich herausgefunden, dass dies tatsächlich vereinfacht und getestet werden kann (wenn man es so nennen kann).

Mein Test geht so:

moduleForModel('person', 'Unit | Serializer | person', { 
    needs: ['serializer:person'], 
}); 

test('testing', function (assert) { 
    const serializer = this.container.lookup('service:store').serializerFor('person'); 

    const payload = { 
    id: 3, 
    }; 

    const response = serializer.normalizeSingleResponse(null, null, payload, payload.id); 

    assert.equal(response.data.id, 3); 
});