百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>JS教程> 使用Jasmine停止Angular单元测试的办法介绍
分享文章到:

使用Jasmine停止Angular单元测试的办法介绍

发布时间:09/01 来源:未知 浏览: 关键词:
本篇文章给大家谈谈怎样使用Jasmine停止Angular单元测试?有必然的参照 价值,有需要的伴侣可以参照 一下,但愿对大家有所帮忙。

以下是我假定那些极少或压根没写单元测试的人预备的,因此,会白话说明诸多概念性问题,同时会结合 Jasmine 与之对应的办法停止讲解。

一、概念

Test Suite

测试套件,哪怕一个简便的类,也会有若干的测试用例,因此将这些测试用例汇合在一个分类下就叫Test Suite

而在 Jasmine 就是使用 describe 全局函数来表示,它的第一个字符串参数用来表示Suite的名称或标题,第二个办法参数就是实现Suite代码了。

describe('test suite name', () => {
});

Specs

一个Specs相当于一个测试用例,也就是我们实现测试详细代码体。

Jasmine 就是使用 it 全局函数来表示,和 describe 相似,字符串和办法两个参数。

而每个 Spec 内包罗多个 expectation 来测试需要测试的代码,只要任何一个 expectation 结果为 false 就表示该测试用例为失败状态。

describe('demo test', () => {
    const VALUE = true;
    it('should be true', () => {
        expect(VALUE).toBe(VALUE);
    })
});

Expectations

断言,使用 expect 全局函数来表示,只接收一个代表要测试的实际值,并且需要与 Matcher 代表盼望值

二、常用办法

Matchers

断言匹配操纵,在实际值与盼望值之间停止比力,并将结果通知Jasmine,终究Jasmine会推断此 Spec 成功还是失败。

Jasmine 供给非常丰硕的API,一些常用的Matchers:

  • toBe() 等同 ===
  • toNotBe() 等同 !==
  • toBeDefined() 等同 !== undefined
  • toBeUndefined() 等同 === undefined
  • toBeNull() 等同 === null
  • toBeTruthy() 等同 !!obj
  • toBeFalsy() 等同 !obj
  • toBeLessThan() 等同 <
  • toBeGreaterThan() 等同 >
  • toEqual() 相当于 ==
  • toNotEqual() 相当于 !=
  • toContain() 相当于 indexOf
  • toBeCloseTo() 数值比力时定义精度,先四舍五入后再比力。
  • toHaveBeenCalled() 检查function可否被调取过
  • toHaveBeenCalledWith() 检查传入参数可否被作为参数调取过
  • toMatch() 等同 new RegExp().test()
  • toNotMatch() 等同 !new RegExp().test()
  • toThrow() 检查function可否会抛出一个错误

而这些API此前用 not 来表示负值的推断。

expect(true).not.toBe(false);

这些Matchers几乎可以知足我们日常需求,当然你也可以定制本人的Matcher来实现非凡需求。

Setup 与 Teardown

一份干将的测试代码很重要,因此我们可以将这些反复的 setup 与 teardown 代码,放在与之相对应的 beforeEachafterEach 全局函数里面。

beforeEach 表示每个 Spec 施行此前,反之。

describe('demo test', () => {
    let val: number = 0;
    beforeEach(() => {
        val = 1;
    });
    it('should be true', () => {
        expect(val).toBe(1);
    });
    it('should be false', () => {
        expect(val).not.toBe(0);
    });
});

数据同享

犹如上面示例中,我们可以在每个测试文件开头、describe 来定义响应的变量,这样每个 it 内部可以同享它们。

当然,每个 Spec 的施行周期间也会陪伴着一个空的 this 对象,直至 Spec 施行完毕后被清空,利用 this 也可以做数据同享。

嵌套代码

有时候当我们对某个组件停止测试时,而这个组件会有不一样状态来展现不一样的结果,这个时候假如只用一个 describe 会显得不外文雅。

因此,嵌套 describe,会让测试代码、测试报告看起来更美丽。

describe('AppComponent', () => {
    describe('Show User', () => {
        it('should be show panel.', () => {});
        it('should be show avatar.', () => {});
    });
    describe('Hidden User', () => { 
        it('should be hidden panel.', () => {});
    });
});

跳过测试代码块

需求总是三心二意的,但好不容易写好的测试代码,难道要删除吗?非也……

Suites 和 Specs 离别可以用 xdescribexit 全局函数来跳过这些测试代码块。

三、配合Angular工具集

Spy

Angular的自定义事件实在太遍及了,但为了测试这些自定义事件,因此监控事件可否正常被调取是非常重要。好在,Spy 可以用于监测函数可否被调取,这几乎就是我们的好伙伴。

以下示例临时不必理会,暂且体验一下:

describe('AppComponent', () => {
    let fixture: ComponentFixture<TestComponent>;
    let context: TestComponent;

    beforeEach(() => {
        TestBed.configureTestingModule({
            declarations: [TestComponent]
        });
        fixture = TestBed.createComponent(TestComponent);
        context = fixture.componentInstance;
        // 监听onSelected办法
        spyOn(context, 'onSelected');
        fixture.detectChanges();
    });

    it('should be called [selected] event.', () => {
        // 触发selected操纵

        // 断言可否被调取过
        expect(context.onSelected).toHaveBeenCalled();
    });
});

异步支撑

第一,这里的异步是指带有 Observable 或 Promise 的异步行动,因此关于组件在调取某个 Service 来异步猎取数据时的测试状态。

假设我们的待测试组件代码:

export class AppComponent {
  constructor(private _user: UserService) {}

  query() {
    this._user.quer().subscribe(() => {});
  }
}

async

async 无任何参数与返回值,所有包裹代码块里的测试代码,可以通过调取 whenStable()所有待处置异步行动都完成后再停止回调;最后,再停止断言操纵。

it('should be get user list (async)', async(() => {
    // call component.query();
    fixture.whenStable().then(() => {
        fixture.detectChanges();
        expect(true).toBe(true);
    });
}));

fakeAsync

假如说 async 还需要回调才能停止断点让你受不了的话,那么 fakeAsync 可以解决这一点。

it('should be get user list (async)', fakeAsync(() => {
    // call component.query();
    tick();
    fixture.detectChanges();
    expect(true).toBe(true);
}));

这里只是将回互换成 tick(),如何样,是不是很酷。

Jasmine自带异步

如前面所说的异步是指带有 Observable 或 Promise 的异步行动,而有时候我们有些东西是依靠 setTimeout 或者大概是需要外部订阅结果今后才能触发时如何办呢?

可以使用 done() 办法。

it('async demo', (done: () => void) => {
    context.show().subscribe(res => {
        expect(true).toBe(true);
        done();
    });
    el.querySelected('xxx').click();
});

四、结论

本章几乎所有的内容在Angular单元测试经常使用到的东西;特殊是异步部分,三种不一样异步方式并非共存的,而是需要按照详细业务而采纳。不然,你会发明真TM难写单元测试。究竟这是一个异步的世界。

自此,我们算是为Angular写单元测试打下了根基。后续,将不会再对这类根基停止说明。

happy coding!

相关教程引荐:angular教程

以上就是使用Jasmine停止Angular单元测试的办法介绍的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有150人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板