angular - 在 Angular 2 服务中测试异步(Promise)方法

标签 angular ionic3 angular2-services angular-services

这是一个有趣的问题:我正在尝试测试一个使用 Ionic BarcodeScanner 的服务。 我有一个基于 ionic unit-testing repository 的 repo 协议(protocol),以便尝试测试。 我通过 spyOn(..).and.callFake(..)

模拟 BarcodeScanner.scan 方法

问题:当我从组件调用扫描方法时,它起作用了。当我在服务中执行完全相同的操作时,它会引发超时。

组件测试代码:

it("should be able to set a spy on the scanner and test the component", done => {
    const testBC = "123456";
    const spy = spyOn(TestBed.get(BarcodeScanner), "scan");
    spy.and.callFake(() => {
        return new Promise((resolve, reject) => {
            resolve(testBC);
        })
    });

        component.testScanner().then(res => {
            expect(res).toBe(testBC);
            done();
        }, reason => {
            expect(true).toBe(false);
            done();
        })
});

服务测试代码:

it("should be able to set a spy on the scanner and test the service", done => {
    const testBC = "123456";
    const spy = spyOn(TestBed.get(BarcodeScanner), "scan");
    spy.and.callFake(() => {
        return new Promise((resolve, reject) => {
            resolve(testBC);
        })
    });

    inject([TestService], (service) => {
        service.testScanner().then(res => {
            expect(res).not.toBe(testBC);
            done()
        }, reason => {
            expect(true).toBe(false);
            done();
        })
    })
});

以这种方式在 Angular 2 中测试服务是否存在任何已知问题?任何帮助表示赞赏!

最佳答案

问题是没有调用注入(inject)函数。

服务的测试代码现在如下所示:

it("should be able to set a spy on the scanner and test the service", done => {
    const testBC = "123456";
    const spy = spyOn(TestBed.get(BarcodeScanner), "scan");
    spy.and.callFake(() => {
        return new Promise((resolve, reject) => {
            resolve(testBC);
        })
    });

    inject([TestService], (service) => {
        service.testScanner().then(res => {
            expect(res).not.toBe(testBC);
            done()
        }, reason => {
            expect(true).toBe(false);
            done(); 
        })
    })(); //<-- do not forget these braces!!
});

关于angular - 在 Angular 2 服务中测试异步(Promise)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47632138/

相关文章:

angular - 监听 Angular 9 Reactive 表单中 2 个依赖字段的变化

angular - 是否可以在不从 DOM 中删除元素的情况下使用 Angular ngIf?

Angular2 http observables - 如何使用未定义的类型

angularjs - Angular Http - promise 或订阅

angular - 将 Ionic 应用程序添加到 Rails 4 应用程序

angularjs - angular 2 observable.subscribe 在第二次调用之前不会执行

javascript - 如何从 Angular 组件中的变量显示 HTMLElement?

angular - (Angular2/4/5/6)如何根据国家/地区验证国际电话号码的长度

ios - Ionic Cordova 构建失败, 'toLowerCase' 未定义

javascript - ionic 2中后台进程调用api