2017-05-28 45 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

这不是一个解决方案的链接,它是图书馆作者在问题上的立场声明,我提交的内容本身很有用,因为它确保了提问者他们遇到的困难不是他们自己的错。这就是说,我会试图扩大答案。 –