加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

单元测试 – 使用jasmine进行Angular2异步单元测试

发布时间:2020-12-17 06:56:50 所属栏目:安全 来源:网络整理
导读:我正在编写一个angular2应用程序,并且无法理解如何使用jasmine编写异步代码的测试.无论出于何种原因,我都没有看到很多看似非常适用于我的情况的例子. 我目前正在尝试测试对另一个服务具有异步依赖性的服务(而不是组件).我不是100%确定测试中的哪一点检查异
我正在编写一个angular2应用程序,并且无法理解如何使用jasmine编写异步代码的测试.无论出于何种原因,我都没有看到很多看似非常适用于我的情况的例子.

我目前正在尝试测试对另一个服务具有异步依赖性的服务(而不是组件).我不是100%确定测试中的哪一点检查异步调用的结果是有效的.你能在服务的异步处理程序中调用expect()吗?

service.foo()
    .then((data) => {
        //do I check the results in here?
        expect(data).toEqual({ a: 1,b: 2 });
        expect(mockDep.get).toHaveBeenCalled();
    });

这是完整的测试.

import { TestBed,inject } from '@angular/core/testing';
import { MyService } from './my.service.ts';
import { MyDependency } from './dependency.service.ts';

class MockDependency {
    doSomething(): Promise<any> {
        throw Error('not implemented');
    };
}

describe('some tests',() => {
    beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [
                MyService,{
                    provide: MyDependency,useClass: MockDependency
                }
            ]
        });
    });
});

it('should do something',inject([MyService,MyDependency],(service: MyService,mockDep: MyDependency) => {
    spyOn(mockDep,'doSomething').and.callFake(function () {
        return Promise.resolve({ a: 1,b: 2 });
    });

    service.foo()
        .then((data) => {
            //do I check the results in here?
            expect(data).toEqual({ a: 1,b: 2 });
            expect(mockDep.get).toHaveBeenCalled();
        });
}));

解决方法

处理异步测试有两个方面,如果你想确保测试真正可靠,你必须关注它们.

首先,您必须确保如果异步检索结果,则在尝试测试结果之前等待结果可用.

因此,如果异步结果是一个承诺,例如,您可以将您的期望放在当时的处理程序中,就像您在问题中指出的那样.

您必须关注的第二个问题是强制您的测试本身在给出积极(或消极)结果之前等待您的期望执行.如果你不处理这个问题,你可能会遇到期望失败的情况,但是因为你的测试没有等到你的异步操作在完成之前完成,所以测试会报告误报.

有几种方法可以“让你的测试等待”.

纯粹的茉莉花方式是将一个完成的处理程序传递给你的it函数.然后jasmine将等待,直到调用完成处理程序,然后才考虑完成测试.

例如.

it('tests an async action',(done) => {
   asyncAction().then(result => {
     expect(result).toEqual(true);
     done();
   });
});

但是,angular的测试框架为此添加了两个其他选项.如果您对异步编程感到满意,那么第一个更容易掌握.

it('tests an async action',async(() => {
   asyncAction().then(result => {
     expect(result).toEqual(true);
   });
}));

在这种情况下,您基本上将测试处理程序包装在异步函数中.在允许测试完成之前,此函数将强制测试等待任何异步结果(例如promises,observables等)返回结果.

第二种方法是使用fakeAsync,它允许您完全隐藏测试的异步性质.

it('tests an async action',fakeAsync(() => {
   let myResult;
   asyncAction().then(result => {
     myResult = result;
   });

   tick();   <--- force all async actions to complete
   expect(myResult).toEqual(true);
}));

fakeAsync挂钩到所有异步函数,并允许您将它们视为同步.您可以使用tick()函数“强制您的测试等待”,以便在继续之前完成异步任务.
(这不是那么做,但从概念上讲,你可以这样想).

See the Angular docs to learn more

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读