jasmine

简介

jasmine 是一个测试驱动开发(TDD)测试框架, 一个js测试框架,它不依赖于浏览器、dom或其他js框架

jasmine有十分简洁的语法

使用

这里 下载 stantd-alone安装包,并解压,双击打开里面的 specRunner.html, 即可看到测试示例,我们只要将自己的js源文件和测试文件分别放到 srcspec 文件夹中。

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的更多相关文章

  1. Jasmine

    Jasmine https://www.npmjs.com/package/jasmine The Jasmine Module The jasmine module is a package of ...

  2. 前端单元测试环境搭建 Karma Jasmine

    Karma 官网On the AngularJS team, we rely on testing and we always seek better tools to make our life e ...

  3. 三星Note 7停产,原来是吃了流程的亏

    三星Note 7发售两个月即成为全球噩梦,从首炸到传言停产仅仅47天.所谓"屋漏偏逢连天雨",相比华为.小米等品牌对其全球市场的挤压.侵蚀,Galaxy Note 7爆炸事件这场连 ...

  4. 《Note --- Unreal --- MemPro (CONTINUE... ...)》

    Mem pro 是一个主要集成内存泄露检测的工具,其具有自身的源码和GUI,在GUI中利用"Launch" button进行加载自己待检测的application,目前支持的平台为 ...

  5. 《Note --- Unreal 4 --- Sample analyze --- StrategyGame(continue...)》

    ---------------------------------------------------------------------------------------------------- ...

  6. [LeetCode] Ransom Note 赎金条

    
Given
 an 
arbitrary
 ransom
 note
 string 
and 
another 
string 
containing 
letters from
 all 
th ...

  7. 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 ...

  8. 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 ...

  9. Beginning Scala study note(7) Trait

    A trait provides code reusability in Scala by encapsulating method and state and then offing possibi ...

随机推荐

  1. Java并发编程实践(读书笔记) 任务执行(未完)

    任务的定义 大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元.   任务的执行策略 1.顺序的执行任务 这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任 ...

  2. Programming C#.Inheritance and Polymorphism

    继承 C#中,创建派生类要在派生类的名字后面加上冒号,后面再跟上基类的名字: public class ListBox : Control 提示:C++程序员注意了,C#没有私有或者保护继承 多态 继 ...

  3. mysql 索引创建规则

    1.表的主键.外键必须有索引:2.数据量超过300的表应该有索引: 3.经常与其他表进行连接的表,在连接字段上应该建立索引: 4.经常出现在Where子句中的字段,特别是大表的字段,应该建立索引: 5 ...

  4. textarea 在浏览器中固定大小和禁止拖动

    HTML 标签 textarea 在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,大小就不会改变,不过更好的办法是使用 CSS 的 height 和 ...

  5. JAVA并发,BlockingQuene

    BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具. BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类1.ArrayBlo ...

  6. 基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构

    基于Java图片数据库Neo4j 3.0.0发布 全新的内部架构 Neo4j 3.0.0 正式发布,这是 Neo4j 3.0 系列的第一个版本.此版本对内部架构进行了全新的设计;提供给开发者更强大的生 ...

  7. java积累

    数组的使用 package javaDemo; import java.util.*; /** * * @author Administrator * @version 1.0 * * */ publ ...

  8. 适配器模式—STL中的适配器模式分析

    适配器模式通常用于将一个类的接口转换为客户需要的另外一个接口,通过使用Adapter模式能够使得原本接口不兼容而不能一起工作的类可以一起工作. 这里将通过分析c++的标准模板库(STL)中的适配器来学 ...

  9. net-ldap for ruby openNebula ldap

    preface:ldap 主要概念及术语 OpenNebula issues:missing step to use LDAP as default driver cp -r /var/lib/one ...

  10. SPOJ 3267 求区间不同数的个数

    题意:给定一个数列,每次查询一个区间不同数的个数. 做法:离线+BIT维护.将查询按右端点排序.从左到右扫,如果该数之前出现过,则将之前出现过的位置相应删除:当前位置则添加1.这样做就保证每次扫描到的 ...