怎么用Qunit测试你的JavaScript代码

如何用Qunit测试你的JavaScript代码原文地址:如何用Qunit测试你的JavaScript代码?QUnit, 由由于所有的断言

如何用Qunit测试你的JavaScript代码
原文地址:如何用Qunit测试你的JavaScript代码

?

QUnit, 由

由于所有的断言都已成功通过,我们可以高兴的认为isEven()工作正常。

让我们看看如果一个断言失败了会发生什么。

该断言失败因为我们故意把它写错,但是在你的项目中,如果测试未通过,并且所有的断言都是正确的,你将发现一个bug。

更多断言

ok()不仅是QUnit提供的唯一断言, 当在测试你的项目时,还会有一些非常有用的其他类型的断言:

比较断言

比较断言,equals(),期望它的第一个参数(是实际值)等于它的第二个参数(期望值)。它很类似于ok(),但均会输入实现和期望值,使得高度更加简单,像ok()一样,它可带一个可选的第三个参数作为显示的消息。

所以可以代替:

你可以这样写:

注意最后一个“1”,这是比较值

如果两个值不相等:

提供更多些信息,让生活更简单些。

比较断言使用“==”来比较它的参数,所以它不能处理数组或对象的比较:

异步测试

在前面的示例中,所有的断言都是同步调用的,这意味着他们是一个接着一个运行的。在这个真实的世界,同样 存在着很多异步的函数,例如

看?这就好像我们没有写任何断言一样。这是因为断言是被异步执行的,到它被调用的时候,此次测试已经执行完成。

这是正确的版本:

在这,我们使用了stop()去暂停此次测试案例, 并且在断言被调用以后,我们使用start()继续。

在调用完test()后立即调用stop()是很平常的;所以QUnit提供了一个捷径:asyncTest()。你可以像这样重写之前的示例:

所以这就是你需要做的:

01// A custom function02function ajax(successCallback) {03????$.ajax({04????????url: 'server.php',05????????success: successCallback06????});07}08?09test('asynchronous test', function() {10????// Pause the test, and fail it if start() isn't called after one second11????stop(1000);12?13????ajax(function() {14????????// ...asynchronous assertions15?16????????start();17????})18})

你可以通过延时去stop(),它告知QUnit,“如果start()在延时后没有被调用,你应未通过测试”。你可以确认的是整个测试没有挂起而且如果哪里出了问题你可以注意到。

那么多个异步函数呢?你在哪里放置start()?可把它放在setTimeout()里:

01// A custom function02function ajax(successCallback) {03????$.ajax({04????????url: 'server.php',05????????success: successCallback06????});07}08?09test('asynchronous test', function() {10????// Pause the test11????stop();12?13????ajax(function() {14????????// ...asynchronous assertions15????})16?17????ajax(function() {18????????// ...asynchronous assertions19????})20?21????setTimeout(function() {22????????start();23????}, 2000);24})

延时应该适当的长足够来允许二者的回调函数在测试继续执行前被调用。但是如果其中一个回调函数没有被调用怎么办?你怎样去知道?这就是expect()加入的原因:

01// A custom function02function ajax(successCallback) {03????$.ajax({04????????url: 'server.php',05????????success: successCallback06????});07}08?09test('asynchronous test', function() {10????// Pause the test11????stop();12?13????// Tell QUnit that you expect three assertions to run14????expect(3);15?16????ajax(function() {17????????ok(true);18????})19?20????ajax(function() {21????????ok(true);22????????ok(true);23????})24?25????setTimeout(function() {26????????start();27????}, 2000);28})

你给expect()传一个数字告知QUnit你期望X个断言去执行,如果一个断言未被执行,这个数字将不会匹配,而且你瘵会注意到有些东西出错了。

这仍有一个expect()的捷径:你只需给test()或asyncTest()的第二个参数传递一个数字:

01// A custom function02function ajax(successCallback) {03????$.ajax({04????????url: 'server.php',05????????success: successCallback06????});07}08?09// Tell QUnit that you expect three assertion to run10test('asynchronous test', 3, function() {11????// Pause the test12????stop();13?14????ajax(function() {15????????ok(true);16????})17? 1 楼 dengjianqiang200 2011-03-31   文章较长,代码较多,javaeye全贴不上来,只能贴部分的。。。