2017-05-28 7 views
0

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?

Antwort

1

Nach Meinung des Autors ist dies "a limitation of the underlying technology" und anscheinend nicht etwas, das sie korrigieren möchten in TypeMoq.

Eine Abhilfe wird angeboten, die then() Methode Stubs auf Mocks Einrichtung beinhaltet, die verspricht Entschlossenheit:

mockModel.setup((x: any) => x.then).returns(() => undefined); 

Ob dies als eine Lösung für das Problem eine Frage der Meinung zu sein scheint, qualifiziert.

+0

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

+0

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. –