在javaScript测试框架jasmine介绍(一)中介绍了编写jasmine测试脚本的语法结构和一些基本的框架特性,在(二)中笔者继续介绍一些不是十分常用,但在某些场景的测试中可能会用到的框架特性。
先来介绍一下Spies:
Jasmine的测试替身被称作spies,spy可以保存任何方法及方法参数的调用痕迹。jasmine有特殊的匹配器来保证spies之间的相互作用。
toHaveBeenCalled这个matcher当spy被调用过时返回true。toHaveBeenCalledWith当参数列表匹配上任何一次spy的调用记录参数时返回true,下图中其余spc都不难理解,只解释,foo.setBar.calls.length为调用setBar的次数。
用andReturn和spy链接在一起,所有调用这个方法将返回一个特殊的value,如下图红框部分
用 andCallFake 和spy链接,所有spy的调用都将委托给用户提供的方法,如下图红框部分
当没有方法能用来spy on,jasmine.createSpy能创建一个空的spy,这个spy和其它spy一样,能跟踪调用参数等,但它没有实现。spies是js对象,可以这样使用
为了创建各种spies的mock,可以使用jasmine.createSpyObj并传一个字符串数组作为参数。它返回的是一个对象,每个String都是该对象的一个属性,成为一个spy,如下图红框的4个字符串都是spy
jasmine.any引用构造函数或者类名作为期望值,和真是的构造函数匹配时返回true
jasmine的Mock Clock是一款有效的测试组件,有能力使用setTimeout或者setInterval回调函数。它使timer回调函数同步,使它们更容易测试
通过在spec或者suite里调用jasmine.Clock.useMock来安装Mock clock。
通过jasmine.Clock.tick方法来标记clock以触发注册的回调函数,这个方法传一个milliseconds.
上面这段话来自对官网的翻译,一些地方不好理解,笔者对下图程序做进一步解释,setTimeout(function() { timerCallback(); }, 100);是一个回调函数,隔100milliseconds调用timerCallback()一次。jasmine.Clock.tick(101)为等待101milliseconds,所以第一次判断timerCallback是否为调用时为未调用,第二次则已调用。而setInterval(function() { timerCallback(); }, 100)则是每隔100milliseconds调用timerCallback()一次,这样解释就不难理解了,第一次判断调用前等待101milliseconds,所以调用次数为1,第二次判断调用前又等待50milliseconds,总等待时间为151milliseconds<200milliseconds,所以仍是调用一次,再等待50milliseconds后总等待时间>200milliseconds,所以第三次判断调用次数就为2
Jasmine支持测试异步操作,通过调用runs定义的一组blocks写入specs,bolcks通常结束于异步调用。waitsFor block需要一个锁方法,一个失败消息,和一个超时时间。锁方法一直轮询直到返回true或者超时。如果超时,spec输出失败信息。一旦异步状况出现,另一个runs block定义最终的测试行为,它期望值通常基于异步调用返回的状态。如下图,起初flag为false,waitsFor一直轮询,直到500 milliseconds后触发setTimeout的function,将flag赋为true后waitsFor在超时时间未到之前结束,waitsFor下面那个runs就是测试行为,笔者看了下value的值为30+。
Jasmine是构建在javaScript之上的,必须包含在一个JS的环境中,如一个web页面,这样才能运行。
jasmine的测试文件用javaScript编写,通过Rocoo被编译进html(Rocoo这里不做介绍,有兴趣的可以自行里了解)。通过
原文转自:http://www.taobaotest.com/blogs/2267