【问题标题】:Angular2 rc4 asynchronous testingAngular2 rc4 异步测试
【发布时间】:2016-07-25 17:06:16
【问题描述】:

我在验证测试时是否调用了异步方法时遇到问题。这是一个简单的例子。

describe('async test', () => {

     it('promise should resolve', async(() => {

         let resolve = jasmine.createSpy('resolve').and.callFake((n) => {
             expect(n).toEqual(1);
         });

         let promise = new Promise((resolve) => {
            resolve(1);
         });

         promise.then(resolve);
         expect(resolve).toHaveBeenCalled();

     }));

});

此测试失败,因为在 promise 解析之前执行了最后一个期望检查是否调用了解析。如果我删除最后的期望,那么就无法验证承诺是否自然解决。这是一个应该失败但不会失败的示例。

describe('async test', () => {

     it('promise should resolve', async(() => {

         let resolve = jasmine.createSpy('resolve').and.callFake((n) => {
             expect(n).toEqual(1);
         });

         let promise = new Promise(() => {});

         promise.then(resolve);

     }));

 });

由于expect 处于从未调用过的resolve 中,即使它不应该通过,因为resolve 从未被调用过。据我了解,Angular2 的 async() 方法不应该在所有异步方法都完成之前完成,但是,情况似乎并非如此。我可以使用 Jasmine2 的 done 函数,但这似乎不能很好地与需要调用 inject() 或 async() 的测试交互。

【问题讨论】:

  • 我遇到了确切的问题。 async 函数似乎根本不等待所有异步任务。

标签: angular jasmine


【解决方案1】:

根据这个discussion,这是依赖加载顺序的问题。

正如@choeller 所指出的,我更改了我的 karma.conf.js,因此 system-polyfills.js 文件在 zone.js 和我的单元开始工作之前加载。但是,我无法使您的剪断工作。我想这是因为它们是概念验证而不是真正的单元测试,是吗?

不管怎样,希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 2017-01-23
    • 1970-01-01
    相关资源
    最近更新 更多