Promise 无法通过 TypeMoq Mock 解决

Jam*_*s B 4 promise jasmine typescript typemoq

我定义MyService如下

export interface MyService {
    doStuff(): Promise<any>;
}
Run Code Online (Sandbox Code Playgroud)

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);
                })
        });
    };    
}
Run Code Online (Sandbox Code Playgroud)

另外,我有一个接口MyModel定义为

export interface MyModel {
    someProperty: string;
}
Run Code Online (Sandbox Code Playgroud)

现在我想编写一个测试,以便可以MyService使用 TypeMoq 进行模拟。所以我做了以下事情

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();
            });
    });
});
Run Code Online (Sandbox Code Playgroud)

然而,Promise.resolve(mockModel.object)当提供 TypeMoq 模拟时,似乎永远不会解决,如上所示,即,我没有得到“Promise returned!” (或“承诺被拒绝!”)打印到控制台,茉莉花测试超时。

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

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

然后测试就可以了(我在控制台上打印出“Promiseresolved!”)。Promise.resolve()为什么在提供 TypeMoq 模拟时无法解析?

Ron*_*eil 5

据作者称,这是“底层技术的限制”,显然他们不打算在TypeMoq中纠正这一点中纠正这一点。

提供了一种解决方法,涉及在模拟上设置then()方法存根,承诺解决以下问题:

mockModel.setup((x: any) => x.then).returns(() => undefined);
Run Code Online (Sandbox Code Playgroud)

这是否可以作为问题的解决方案似乎是一个见仁见智的问题。

  • 这不是解决方案的链接,而是库作者对问题的立场的陈述,我提交的内容本身很有用,因为它向提问者保证他们遇到的困难不是他们自己的错。也就是说,我将尝试扩展答案。 (2认同)