I MyService
definiert haben wie folgtVersprechen schlägt mit TypeMoq Mock Resolve
export interface MyService {
doStuff(): Promise<any>;
}
und MyClass
die MyService
als
import {MyService} from "./my.service";
import {Observable} from "rxjs/Observable";
export class MyClass {
constructor(private myService: MyService) {}
useMyService(): Observable<boolean> {
return Observable.create(obs => {
this.myService.doStuff()
.then((res: any) => {
console.log("Promise resolved!");
obs.next(true);
})
.catch((err: any) => {
console.log("Promise rejected!");
obs.error(false);
})
});
};
}
Zusätzlich verbraucht, ich habe eine Schnittstelle MyModel
definiert als
export interface MyModel {
someProperty: string;
}
Jetzt möchte ich einen Test s schreiben Ich kann MyService
mit TypeMoq spotten. Also habe ich die folgende
describe('MyClass',() => {
it('useMyService returns true when myService returns true', (done) => {
let mockModel = TypeMoq.Mock.ofType<MyModel>();
mockModel.setup(x => x.someProperty).returns(() => "info");
let mockMyService = TypeMoq.Mock.ofType<MyService>();
mockMyService.setup(x => x.doStuff()).returns(() => Promise.resolve(mockModel.object));
let myClass = new MyClass(mockMyService.object);
myClass.useMyService().subscribe(
(result: boolean) => {
expect(result).toBeTruthy();
done();
},
(error: any) => {
expect(error).toBeFalsy();
done();
});
});
});
Allerdings scheint die Promise.resolve(mockModel.object)
nie zu lösen, wenn sie mit dem TypeMoq mock geliefert, wie oben gezeigt, das heißt, ich nicht bekommen „Versprechen gelöst!“ (oder "Versprechen abgelehnt!") auf die Konsole gedruckt und der Jasmin-Test läuft ab.
Wenn ich ersetzen Promise.resolve(mockModel.object)
mit Promise.resolve({ someProperty: 'info'})
, das heißt
let mockMyService = TypeMoq.Mock.ofType<MyService>();
mockMyService.setup(x => x.doStuff()).returns(() => Promise.resolve({ someProperty: 'info'}));
dann die Testarbeiten (I "Versprechen gelöst!" Get an die Konsole gedruckt). Warum löst Promise.resolve()
nicht auf, wenn es mit einem TypeMoq-Schein geliefert wird?
Ein Link zu einer Lösung ist willkommen, aber bitte stellen Sie sicher, dass Ihre Antwort ohne sie nützlich ist: [Fügen Sie einen Kontext um den Link hinzu] (// meta.stackexchange.com/a/8259), damit Ihre Mitbenutzer eine Idee haben es ist und warum ist es da, dann zitieren Sie den relevantesten Teil der Seite, auf die Sie verlinken, falls die Zielseite nicht verfügbar ist. [Antworten, die kaum mehr als ein Link sind, können gelöscht werden.] (// stackoverflow.com/help/deleted-answers) – sudo
Dies ist kein Link zu einer Lösung, es ist eine Aussage der Position des Bibliotheksautors zu dem Problem, was ich vorlege, ist allein nützlich, weil es dem Fragesteller versichert, dass die Schwierigkeiten, denen sie begegnen, nicht ihre eigene Schuld sind. Das heißt, ich werde versuchen, die Antwort zu erweitern. –