2017-05-28 47 views
0

我定義MyService如下承諾無法與TypeMoq模擬化解

export interface MyService { 
    doStuff(): Promise<any>; 
} 

MyClass消耗MyService作爲

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

另外,我有一個接口MyModel定義爲

export interface MyModel { 
    someProperty: string; 
} 

現在我想寫一個測試s我可以用TypeMoq模擬MyService。所以我做了以下

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

然而,Promise.resolve(mockModel.object)似乎從來沒有在與TypeMoq模擬提供如上圖所示,即,我沒有得到解決「無極解決!」 (或「承諾拒絕!」)打印到控制檯,茉莉花測試超時。

如果我更換Promise.resolve(mockModel.object)Promise.resolve({ someProperty: 'info'}),即

let mockMyService = TypeMoq.Mock.ofType<MyService>(); 
     mockMyService.setup(x => x.doStuff()).returns(() => Promise.resolve({ someProperty: 'info'})); 

那麼測試工作(我得到 「無極解決!」 打印到控制檯)。爲什麼Promise.resolve()在提供TypeMoq模擬時解析?

回答

1

根據作者,這是「a limitation of the underlying technology」,顯然不是他們打算糾正的TypeMoq

一種解決方法是提供的是包括在嘲笑設置then()方法存根,承諾的決心:

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

這是否有資格作爲一個解決問題的辦法似乎是見仁見智。

+0

歡迎您訪問解決方案的鏈接,但請確保您的答案在沒有它的情況下是有用的:[添加鏈接的上下文](// meta.stackexchange.com/a/8259),以便您的同行用戶瞭解什麼它是,爲什麼它在那裏,然後引用您鏈接到的頁面最相關的部分,以防目標頁面不可用。 [答案只是一個鏈接而已,可能會被刪除。](// stackoverflow.com/help/deleted-answers) – sudo

+0

這不是一個解決方案的鏈接,它是圖書館作者在問題上的立場聲明,我提交的內容本身很有用,因爲它確保了提問者他們遇到的困難不是他們自己的錯。這就是說,我會試圖擴大答案。 –