jasmine note
jasmine
简介
jasmine 是一个测试驱动开发(TDD)测试框架, 一个js测试框架,它不依赖于浏览器、dom或其他js框架
jasmine有十分简洁的语法
使用
从 这里 下载 stantd-alone安装包,并解压,双击打开里面的 specRunner.html, 即可看到测试示例,我们只要将自己的js源文件和测试文件分别放到 src 和 spec 文件夹中。
specRunner.html 到底是长什么样子的呢? f12 我们发现 先后加载了 jasmine.css, jasmine.js ,jasmine-html.js, boot.jsjasmine框架相关文件和 我们的 js源文件 jasmine测试文件
语法
分组 describe()
describe的作用是群组相关的测试, describe是可以嵌套的 从外到内 walkdown describe层级的 beforeEach, 由内到外walkup describe层级的 afterEach
describe('a suite', function(){ //这是一个测试分组
it('with an expactation',function(){
expect(true).toBe(true);
});
});
测试it()
describe 和 it 都是函数,所以它们可以包含任何js代码, 在 describe 中声明的变量和方法,能在 it中被访问。
it 代表的是具体的测试,当其中所有的断言都为true时,则该测试通过; 否则测试失败
describe('a suit is just a function', function(){
var a = 10;
it('and here is a test', function(){
var a = true;
expect(a).toBe(true);
});
});
期望expect()
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);
jasmine有很丰富的匹配方法,而且可以自定义匹配方法。 内置的匹配方法有:
toBe()
toEqual()
toMatch()
toBeUndefined()
toBeNull()
toBeTruthy()
toContain()
toBeLessThan()
toBeCloseTo()
toThrowError()
describe("included matchers", function(){
it('"toBe" matcher compares width === ', function(){
var a = 12;
var b = a;
expect(a).toBe(b);
expect(a).not.toBe(null);
}); describe('"toEqual" matcher', 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 is for regular expression', 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(), afterEach()
beforeEach() 在它所属的 describe 块中的每条测试执行前,先执行的js代码, 作用就是设置和初始化一些东西。
afterEach() 和 beforeEach 相反,在 describe 块的每条测试执行后执行, 做一些清理的工作。
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对象, 每次执行完1条测试之后,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', function(){
expect(this.foo).toEqual(0);
expect(this.bar).toBe(undefined);
});
});
describe嵌套 beforeEach串行
describe('a suite', function(){
var foo;
beforeEach(function(){
foo = 0;
foo += 1;
});
afterEach(function(){
foo = 0;
});
it('a spec', function(){
expect(foo).toEqual(1);
});
it('a spec too', function(){
expect(foo).toEqual(1);
expect(true).toEqual(true);
});
describe('nested inside describe', function(){
var bar;
beforeEach(function(){
bar = 1;
});
// exec outer's describe beforeEach > this describe's beforeEach
it('可以访问外部describe的beforeEach的变量', function(){
expect(foo).toEqual(bar);
});
});
});
禁用describe或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');
if('can be declared by calling "pending()" in spec body', function(){
expect(true).toBe(false);
pending(); //禁用该测试
});
});
函数调用监听 spy
spyOn() , toHaveBeenCalled() , toHaveBeenCalledWith()
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);
})
});
jasmine note的更多相关文章
- Jasmine
Jasmine https://www.npmjs.com/package/jasmine The Jasmine Module The jasmine module is a package of ...
- 前端单元测试环境搭建 Karma Jasmine
Karma 官网On the AngularJS team, we rely on testing and we always seek better tools to make our life e ...
- 三星Note 7停产,原来是吃了流程的亏
三星Note 7发售两个月即成为全球噩梦,从首炸到传言停产仅仅47天.所谓"屋漏偏逢连天雨",相比华为.小米等品牌对其全球市场的挤压.侵蚀,Galaxy Note 7爆炸事件这场连 ...
- 《Note --- Unreal --- MemPro (CONTINUE... ...)》
Mem pro 是一个主要集成内存泄露检测的工具,其具有自身的源码和GUI,在GUI中利用"Launch" button进行加载自己待检测的application,目前支持的平台为 ...
- 《Note --- Unreal 4 --- Sample analyze --- StrategyGame(continue...)》
---------------------------------------------------------------------------------------------------- ...
- [LeetCode] Ransom Note 赎金条
Given an arbitrary ransom note string and another string containing letters from all th ...
- Beginning Scala study note(9) Scala and Java Interoperability
1. Translating Java Classes to Scala Classes Example 1: # a class declaration in Java public class B ...
- Beginning Scala study note(8) Scala Type System
1. Unified Type System Scala has a unified type system, enclosed by the type Any at the top of the h ...
- Beginning Scala study note(7) Trait
A trait provides code reusability in Scala by encapsulating method and state and then offing possibi ...
随机推荐
- (转载)SQL语句中Group by语句的详细介绍
转自:http://blog.163.com/yuer_d/blog/static/76761152201010203719835 SQL语句中Group by语句的详细介绍 ...
- SharedPreferences最佳实践
转:http://blog.csdn.net/xushuaic/article/details/24513599 笔记摘要:该文章是我在Android Weekly中看到的,以前也一直用SharedP ...
- Javascript 匀速运动——应用案例:网站常用功能分享到
网站上会经常用到Javascript 中的运动,这次与大家分享一下一些运动的基本应用 . 方便大家在开发中能够直接使用. 代码简单易懂,适用于初学者.最后会一步一步整理出一套自己的运动框架. 应用案例 ...
- codeforces 665E Beautiful Subarrays
题目链接 给一个数列, 让你找出异或结果大于等于k的子序列的个数. 因为任意一段序列的异或值都可以用前缀异或和来表示, 所以我们先求出前缀异或和. 我们考虑字典树, 对于每一个前缀sum, 我们先查询 ...
- SQL Server 一些重要视图2
1. sys.dm_tran_session_transactions 为每一个没有关闭的事务返回一行.session_id 可以与sys.dm_exec_connections.session_id ...
- 在VC6.0下如何调用Delphi5.0开发的进程内COM
因为本人的语言水平很差,考大学时150的总分,我考了个60分.外语也是,初中及格过一次,会考及格过一次.其它的时间好像从没有及格过.所以我不写文章,因我一百字的文章给我写,至少要出八九个错别字.哈哈… ...
- NOI2011 Day1
NOI2011 Day1 兔农 题目描述:\(fib[1]=fib[2]=1, fib[i]=fib[i-2]+fib[i-1] (i\geq 3)\),若\(fib[i] \equiv 1(mod ...
- Cpp again
1,
- linux内核源码阅读之facebook硬盘加速flashcache之五
正常流程到flashcache_map的1623行或1625行,按顺序先看读流程: 1221static void 1222flashcache_read(struct cache_c *dmc, s ...
- 为什么需要Page Object?
为什么需要Page Object? Page Object(PO)是界面自动化验收测试中的一个常见模式,要和@槽神刘叫兽探讨一下PO的必要性,顾写这篇小文表达一下我的观点. PO的主要价值体现在对界面 ...