Ich denke, ich habe endlich zu einem vernünftigen Abschluss gekommen. Lassen Sie mich mit Ihnen teilen, was meiner Meinung nach der beste Weg ist, sich an Unit Testing Services zu wenden, die sich auf den Laden verlassen.
Die Antwort liegt wirklich in der Annahme, die wir beim Schreiben unit tests machen müssen. Das heißt, alles außerhalb unserer logischen Einheit sollte als ordnungsgemäß funktionieren und unsere Einheiten sollten vollständig unabhängig sein.
Daher ist es am besten mit einem Dienst, der sich auf den Laden verlässt, einen Stub oder Mock (siehe this question, um den Unterschied zwischen einem Schein und einem Stub zu verstehen) für den Laden. Ein Stummel für den Laden selbst ist ziemlich einfach. So etwas wie dies tun:
store: {
find: function() {
var mockedModel = Ember.Object.create({/*empty*/});
return mockedModel;
},
query: ...
}
Wenn Sie lieber ein Modell verwenden, anstatt Sie so etwas wie das folgende tun könnte (ich machte dieses sehr schnell, so dass es nicht vollständig funktionieren könnte, aber seine genug, um die Idee zu vermitteln):
import Ember from 'ember';
class MockStore {
constructor() {
this.models = Ember.A([]);
}
createRecord(modelName, record) {
// add a save method to the record
record.save =() => {
return new Ember.RSVP.Promise((resolve) => {
resolve(true);
});
};
if (!this.models[modelName]) {
this.models[modelName] = Ember.A([]);
}
this.models[modelName].pushObject(record);
return record;
}
query(modelName, query) {
let self = this;
return new Ember.RSVP.Promise((resolve) => {
let model = self.models[modelName];
// find the models that match the query
let results = model.filter((item) => {
let result = true;
for (let prop in query) {
if (query.hasOwnProperty(prop)) {
if (!item[prop]) {
result = false;
}
else if (query[prop] !== item[prop]) {
result = false;
}
}
}
return result;
});
resolve(results);
});
}
}
export default MockStore;
Weiter alles, was Sie tun müssen, ist die Speichereigenschaft (oder was auch immer Sie nennt es) auf Ihrem Service zu einer neuen Mock Speicherinstanz zu setzen, wenn Sie einen Test durchführen. Ich tat dies, wie so:
import Ember from 'ember';
import { moduleFor, test } from 'ember-qunit';
import MockStore from '../../helpers/mock-store';
let session;
let store;
const username = '';
const password = '';
moduleFor('service:authentication', 'Unit | Service | authentication', {
beforeEach() {
session = Ember.Object.create({});
store = new MockStore();
}
});
test('it should authenticate the user', function (assert) {
// this sets the store property of the service to the mock store
let authService = this.subject({session: session, store: store});
authService.authenticate(username, password).then(() => {
assert.ok(session.get('username'));
});
});
Die Dokumentation, diese Situationen zu testen definitiv schlecht ist, so vielleicht gibt es eine bessere Methode, aber das ist, was ich mit jetzt rollen.Auch, wenn Sie das Discourse Projekt, das ember verwendet, auschecken, folgen sie einem ähnlichen Muster zu dem, was ich hier beschrieben habe, aber in einer etwas fortgeschritteneren Art und Weise.
Ich versuche auch so etwas zu tun und finde keine Dokumentation zu diesem Thema. Ich habe angefangen, einige Projekte zu betrachten, die Glut verwenden, und ich hoffe, dass ich bald einige Beispiele finde. [Hier ist was ich bisher habe] (http://pastebin.com/8sMFNdQN) wenn es überhaupt hilft. – cojomojo
@cojomojo Wie würde das 'MockStore' Modul aussehen, das du auskommentiert hast? – BillPull
siehe meine Antwort für ein Beispiel – cojomojo