jasmine学习(二)--API

jasmine基本结构:

describe('当前测试标题/描述' , ()=>{let num : number;beforeEach(()=>{// 这个是在每个it之前执行的num = 0;num +=1;});afterEach(()=>{// 每个it之后执行的num = 0;});it('该测试用例要测试的内容文本描述', ()=>{expect(true).toBe(true);    });describe('nested inside describe', function(){var bar; beforeEach(function(){bar = 1;});// exec outer's describe beforeEach > this describe's beforeEachit('可以访问外部describe的beforeEach的变量', function(){expect(foo).toEqual(bar);});});});

API

分组 describe(string,function)

属于全局函数,两个参数

1.string 组函数的描述

2.测试组函数

describe的作用就是相当于包含多个it的群组的测试,describe可以嵌套,也就是可以包含多个describe,it,beforeEach等函数


describe('a suite', function(){ //这是一个测试分组it('with an expactation',function(){expect(true).toBe(true);});
});

测试 it(string, function)

 两个参数

1. string 具体测试的名称或文本描述

2. function 具体测试的函数方法

it属于具体的spec测试,只有当里面的expect断言全部为true才表示测试通过,否侧都是测试失败

describe('a suit', function(){var a = 10;it('is a test', function(){var a = true;expect(a).toBe(true);});
});

期望 expect()

expect是指该测试期望出现的值,一般搭配匹配to*()方法来具体执行判断逻辑

desribe('the "toBe" matcher compares with "===" ', function(){it('positive expect', function(){expect(true).toBe(true);});it('negative expect', function(){expect(false).not.toBe(true);});
});
匹配 to*()

每个匹配方法在期望值和实际值中执行逻辑比较,来告诉jasmine断言的真假,以此判断测试是否通过。

  • 肯定断言: expect(true).toBe(true);
  • 否定断言:expect(false).not.toBe(true);

内置的一些匹配方法:

  • toBe(): 等同于 === ,用来比较变量
  • toEqual(): 用来处理变量,数组,对象等
  • toMatch(): 使用正则表达式进行匹配
  • toBeDefined(): 是否已声明且被赋值
  • toBeUndefined(): 是否未声明
  • toBeNull(): 是否为null
  • toBeTruthy(): 如果转换为布尔值,是否为true
  • toBeFalsy(): 如果转换为布尔值,是否为false
  • toContain(): 数组中是否包含某个元素(值),只能用于数组,不能用于对象
  • toBelessThan(): 数值比较,小于
  • toBeGreaterThan(): 数值比较,大于
  • toBeCloseTo(): 数值比较,比较时要定义精度,先四舍五入再比较
  • toThrow(): 检验一个函数是否会抛出一个错误
  describe("included matchers 匹配器", function(){it('"toBe" 匹配相当于 === ', function(){var a = 12;var b = a;expect(a).toBe(b);expect(a).not.toBe(null);});describe('"toEqual" 处理变量,数组,对象等', function(){it('work for simple literals and variable', function(){var a = 12;expect(a).toEqual(12);});it('should work for objects', function(){var foo = {a: 12,b: 23};var bar = {a: 12,b: 23};expect(foo).toEqual(bar); //true?});});it('"toMatch" matcher 正则式', function(){var message = "foo bar baz";expect(message).toMatch(/bar/);expect(message).toMatch("bar");expect(message).not.toMatch(/quue/);});it('"toBeUndefined" matcher compares against "undefined"', function(){var a = {foo: "foo"};expect(a.foo).not.toBeUndefined();expect(a.bar).toBeUndefined();});it(' "toBeNull" matcher compares against "null"', function(){var a = null;var foo = 'foo';expect(null).toBeNull();expect(a).toBeNull();expect(foo).not.toBeNull();});it('"toBeTruthy" matcher is for boolean casting testing' , function(){var a, foo = 'foo';expect(foo).toBeTruthy();expect(a).not.toBeTruthy();});it('"toContain" matcher is for finding an item in an array', function(){var a = ['foo', 'bar', 'baz'];expect(a).toContain('bar');expect(a).not.toContain('quu');});it('"toBeLessThan" matcher is for math comparisons', function(){var n = 2.23, e = 1.33;expect(e).toBeLessThan(n);expect(n).not.toBeLessThan(e);});it('"toBeCloseTo" matcher is for precision match comparison', function(){var n = 1.99, e = 2.35;expect(e).not.toBeCloseTo(n, 2);expect(e).toBeCloseTo(n, 0);});it('"toThrowError" matcher is for testing a specific thrown exception', function(){var foo = function(){throw new TypeError('foo bar baz');};expect(foo).toThrowError('foo bar baz');expect(foo).toThrowError(/bar/);expect(foo).toThrowError(TypeError);expect(foo).toThrowError(TypeError, 'foo bar baz');});});

设置 beforeEach(string,function) 清理 afterEach(string,function)

beforeEach() 在它所属的describe块中所有的it测试之前执行的一些js代码,主要用来设置一些变量和初始化一些东西。

afterEach()在它所属的describe块中所有的it测试执行之后执行,主要做清理工作,比如清除用来测试所创建的dom等。

describe('tests with "setup" and "tear-down"', function(){var foo;beforeEach(function(){foo = 0;foo += 1; //每次测试前都初始化 foo == 1});afterEach(function(){foo = 0; //每次测试完都重置 foo = 0;});it('it is just a function , so can contain any code', function(){expect(foo).toEqual(1);});it('can have more than one expectation', function(){expect(foo).toEqual(1);expect(true).toEqual(true);});
});

this对象

另一种在beforeEach,afterEach,it 之间共享变量的方法:this对象,在每次执行完一条测试后都会重置为空对象。

describe('a suite', function(){beforeEach(function(){this.foo = 0;});it('can use "this" to share initial data', function(){expect(this.foo).toEqual(0);this.bar = "test pollution?";});it('prevents test pollution by having an empty "this" created for next test', fuction(){expect(this.foo).toEqual(0);expect(this.bar).toBe(undefined);});
});

禁用dedscribe或it

xdescribe(),xit()pending()

xdescribe('a suite',function(){//will not execute
});describe('a suite too', function(){xit('this test be canceled', function(){expect(true).toBe(false);});it('can be desclared with "it" but without a function');it('can be declared by calling "pending()" in spec body', function(){expect(true).toBe(false);pending(); //禁用该测试});
});

函数调用监听 spy

spyOn() ,toHaveBeenCalled() ,toHaveBeenCalledWith() 这部分内容很多,spyOn函数可以模拟和监听函数调用,这里只是大概一写

describe('a spy', function(){var foo, bar = null;beforeEach(function(){foo = {setBar = function(value){bar = value;};};spyOn(foo, 'setBar');foo.setBar(123);foo.setBar(456, 'another param');});it('tracks that the spy was called', function(){expect(foo.setBar).toHaveBeenCalled();});it('tracks all the arguments of its calls', function(){expect(foo.setBar).toHaveBeenCalledWith(123);expect(foo.setBar).toHaveBeenCalledWith(456, 'another param');});it('stops all execution on a function', function(){expect(bar).toBeNull(); //setBar函数的执行 被spy监听器暂停了。});
});describe('a spy, when configured to call through', function(){var foo , bar, fetchedBar;beforeEach(function(){foo = {setBar: function(value){bar = value;},getBar: function(){return bar;}};spyOn(foo, 'getBar').and.callThrough();foo.setBar(123);fetchedBar = foo.getBar();});it('tracks that the spy was called', function(){expect(foo.getBar).toHaveBeenCalled();});it('should not effect other function', function(){expect(bar).toEqual(123);});it('when called returns the requested value' , function(){expect(fetchedBar).toEqual(123);})
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/767773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【项目设计】基于MVC的负载均衡式的在线OJ

项目代码(可直接下载运行) 一、项目的相关背景 学习编程的小伙伴,大家对力扣、牛客或其他在线编程的网站一定都不陌生,这些编程网站除了提供了在线编程,还有其他的一些功能。我们这个项目只是做出能够在线编程的功能。…

详解JavaScript中this指向

this 原理 this 是一个指针型变量,它指向当前函数的运行环境。 1.内存的数据结构 var obj { foo: 5 };2.函数 var obj { foo: function () {} };引擎会将函数单独保存在内存中,然后再将函数的地址赋值给foo属性的value属性。 由于函数是一个单独的…

代码随想录day28(1)二叉树:二叉搜索树中的插入操作(leetcode701)

题目要求:给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。 思路:对于二叉搜索树来说&…

【深度解析算法】散列表 上

8 散列表 如果所有的键都是小整数,我们可以用一个数组来实现无序的符号表,将键作为数组的索引而数组中键i处储存的就是它对应的值。这样我们就可以快速访问任意键的值。在本节中我们将要学习散列表。它是这种简易方法的扩展并能够处理更加复杂的类型的键…

常见技术难点及方案

1. 分布式锁 1.1 难点 1.1.1 锁延期 同一时间内不允许多个客户端同时获得锁; 1.1.2 防止死锁 需要确保在任何故障场景下,都不会出现死锁; 1.2.3 可重入 特殊的锁机制,它允许同一个线程多次获取同一个锁而不会被阻塞。 1.2…

Web前端Html的表单

表单的关键字: form标签表示一个表单区域 action“后端地址” method“提交数据方式:get/post” input 单行输入框 type“text” 文本 name“定义名称 名字自定义” 向后端提交的键 readonly“readonly” 只读,不可修改,但是可以提交 disab…

C语言学习-day22-函数递归1

程序调用自身的编程技巧被称为递归。举个例子: int main() { printf("hehe\n"); main(); return 0; } 比如这种,自己调用自己后每次都打印一个hehe。 递归的核心思考方式在于:大事化小。 做个练习:接收一个整型值&a…

鸿蒙Harmony应用开发—ArkTS-类型定义

说明: 本模块首批接口从API version 7开始支持,后续版本的新增接口,采用上角标单独标记接口的起始版本。 Resource 资源引用类型,用于设置组件属性的值。 可以通过$r或者$rawfile创建Resource类型对象,不可以修改Res…

【S056】Clause46--XGMII接口摘要

文章目录 XGMII数据与lane的对应关系是什么?XGMII上的数据流格式是什么?如何保证0xFB每次都在Lane0?方法一:方法二: Link Fault信号 XGMII数据与lane的对应关系是什么? XGMII上的数据流格式是什么&#xff…

GDC期间LayaAir启动全球化战略

3 月 18 日至 3 月 22 日,一年一度的游戏开发者大会(GDC)在美国旧金山举行。在此期间,Layabox宣布LayaAir引擎启动全球扩张战略,这标志着引擎将步入快速发展的新阶段。此举旨在利用公司先进的3D引擎技术,将…

Linux之git

一、什么叫做版本控制 版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。简单来说就是用于管理多人协同开发项目的技…

Affiliate Stores: 建立营销联盟商店的详细教程- US Domain Center主机

第一步:了解营销联盟商店 营销联盟商店是一种电子商务模式,您可以在其中通过推广其他企业的产品或服务来赚取佣金。您在自己的网站上展示其他企业的产品,并在买家购买时获得佣金。通过 WooCommerce 平台,您可以轻松创建一个营销联…

学习总结!

java目前学习到了数组部分 广搜,在开始的时候把#处理一下会好做很多,遇到上下两层都是# 的,就把上下两层的这个位置都弄成墙就行。还有遇到 一层是#,一层是墙的。也直接把俩都弄城墙就行,省的要判断他撞死,…

vue2的v-model不更新

场景 动态生成组件时,动态为表单添加属性,同时使用v-model以数组形式访问表单属性。通过监听表单对象,发现并未实施更新。 原因 vue2无法监听数组索引一系列操作,从而不能及时响应。vue2是通过Object.definePropertys实现响应式的…

部署mysql,前端,后端

部署mysql docker pull mysql 从镜像源中拉取镜像。 创建mysql容器 docker run -d \--name mysql_container \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \--restartalways \-v /opt/mysql:/var/lib/mysql \mysql -d后台运行,--name指定容器…

【JavaScript】JavaScript 程序流程控制 ⑤ ( 嵌套 for 循环 | 嵌套 for 循环概念 | 嵌套 for 循环语法结构 )

文章目录 一、嵌套 for 循环1、嵌套 for 循环概念2、嵌套 for 循环语法结构 二、嵌套 for 循环案例1、打印三角形2、打印乘法表 一、嵌套 for 循环 1、嵌套 for 循环概念 嵌套 for 循环 是一个 嵌套的 循环结构 , 其中一个 for 循环 位于另一个 for 循环的内部 , 分别是 外层 f…

计算机网络实验——学习记录二(HTTP协议)

1. Linux主机上连接互联网的网络接口是:ens33。 2. 在显示过滤器(Filter)中输入“ http.host www.zzu.edu.cn”,筛选出HTTP协议报文首部行中包含“ Host:www.zzu.edu.cn”的报文(目的地址是Web服务器的报…

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费,70元。据说可以导出 Verilog !

十.pandas方法总结Numpy

目录 十.pandas方法总结 1.索引切片 2.数据排序 3.数据统计 Pandas数据计算 4.数据查看 5.数据清洗 6-数据分组 查看分组结果 7-处理第三方数据 csv文件操作 Excel文件操作 Excel文件读取read_excel Excel文件写入 to_excel() SQL操作 mysql读取 数据保存 pa…

Ubuntu 未能识别较新型号 Nvidia 显卡案例分析

(首发地址:学习日记 https://www.learndiary.com/2024/03/unknown-nvidia-card-in-ubuntu/ ) 大家好,我是在淘宝“学习日记小店”做 Linux 服务的 learndiary。本文分享两个关于 Ubuntu 操作系统未能正确识别新型 NVIDIA 显卡型号…