【问题标题】:Test Promise<string> value in Angular 2 unit tests在 Angular 2 单元测试中测试 Promise<string> 值
【发布时间】:2017-01-13 13:36:00
【问题描述】:

下面是示例,测试失败 - str 未定义。 如何从 angular2 中的 promise 中获取价值?

 describe('Test', () => {
        it('case of string', () => {
            let t: Promise<string> = deserializeSimpleField(...);
            let str:string;
            t.then(value=>str = value);
            expect(str).toEqual('name');
        });});

【问题讨论】:

    标签: angular jasmine angular-promise


    【解决方案1】:

    异步执行具有传染性。您无法返回同步执行。

    describe('Test', () => {
        it('case of string', inject([AsyncTestCompleter], (async: AsyncTestCompleter) => {
            deserializeSimpleField(...)
            .then(value => {
              expect(value).toEqual('name');
              async.done();
            });
        });
    });
    

    我在https://github.com/angular/angular/blob/master/modules/@angular/forms/test/form_array_spec.ts查到了

    更新

    describe('Test', () => {
        it('case of string', async(() => {
            return deserializeSimpleField(...)
            .then(value => {
              expect(value).toEqual('name');
              async.done();
            });
        }));
    });
    

    【讨论】:

    • 亲爱的@Gunter 我使用@angular/testing ,并且缺少 AsyncTestCompleter?是否存在通过@angular/testing 实现的方式?
    • 实际上我不知道进行异步测试的正确和当前方法是什么。我也无法在更改日志中找到任何内容。我刚刚在最近更新的 github 存储库中查找了一个测试。你能试试我更新的答案吗? (不确定是否需要添加return)。
    • 更新版本带来:TypeError: AsyncTestZoneSpec is not a constructor at runInAsyncTestZone
    • 抱歉,没有想法。
    • 非常感谢你,亲爱的@Gunter 提供想法
    【解决方案2】:
    I resolve question following way,(using  fakeAsync,tick..)
    
    require('zone.js/dist/fake-async-test');
    import {describe, it, expect, fakeAsync, tick} from '@angular/testing'
    describe('my first test', () => {
        it('Promises fulfilled by tick',fakeAsync((): void => {
            let promise:Promise<number> =Promise.resolve(11);
            let x:number;
            promise.then( v => {
                x = v;
            });
            tick();
            expect(x).toBe(11);
        }));
    });
    

    【讨论】:

    • 亲爱的@Gunter,请查看解决方案。
    • 唯一的区别似乎是fake,对吧? (和tick();
    • 是的。 tick() - 模拟 fakeAsync 区域中计时器的异步时间流逝。
    • 很奇怪。如果fakeAsync 有效,async 也应该有效。很高兴听到您找到了一种适合您的方法。
    • 我认为使用 tick() 你的 async(..) 也可以。谢谢亲爱的 Gunter。 p.s.我投票给你的答案。 :)
    猜你喜欢
    • 2018-04-11
    • 2021-12-23
    • 2017-03-22
    • 2016-12-29
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多