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模擬時解析?
歡迎您訪問解決方案的鏈接,但請確保您的答案在沒有它的情況下是有用的:[添加鏈接的上下文](// meta.stackexchange.com/a/8259),以便您的同行用戶瞭解什麼它是,爲什麼它在那裏,然後引用您鏈接到的頁面最相關的部分,以防目標頁面不可用。 [答案只是一個鏈接而已,可能會被刪除。](// stackoverflow.com/help/deleted-answers) – sudo
這不是一個解決方案的鏈接,它是圖書館作者在問題上的立場聲明,我提交的內容本身很有用,因爲它確保了提問者他們遇到的困難不是他們自己的錯。這就是說,我會試圖擴大答案。 –