使用qUnit时,如何在每次测试之前运行函数?

时间:2009-11-05 20:36:54

标签: javascript tdd nunit qunit

qUnit的nUnits [SetUp]属性的等价物是什么?

3 个答案:

答案 0 :(得分:16)

注册QUnit回调

var mySetupFunc(details){/* setup code */}
QUnit.testStart(mySetupFunc);

回调详情

从QUnit版本1.10.0pre-A开始,每个注册的callback将收到一个哈希作为第一个(也是唯一的)参数。我在上面的例子中命名了我的'详细信息'。哈希的内容因回调而异。这是每个哈希中的信息列表。

<强> begin
(所有测试的开始)

{}  /* empty hash */

<强> done
(所有测试结束)

  • 失败:(int)总测试失败
  • 传递:(int)传递的总测试
  • 总计:(int)总测试运行
  • runtime:(int)以毫秒为单位运行测试的时间

<强> log
(在ok()方法中调用等)

  • result:(boolean)如果是好则为true,如果失败则为false
  • message:(string)您传递给ok()
  • 的任何消息

<强> testStart
(在每个测试开始时调用)

  • name:测试的名称(传递给test()或asyncTest()的第一个参数)
  • module:模块的名称(如果你没有调用module()方法,这将是未定义的)

<强> testDone
(在每次测试结束时调用)

  • name :( string)测试的名称(传递给test()或asyncTest()的第一个参数)
  • module:(string)模块的名称(如果你从未调用过module()将会是未定义的)
  • 失败:(int)失败的断言次数
  • 传递:( int)成功断言的次数
  • total:(int)测试中所有断言的计数

<强> moduleStart
(在每个模块的开头调用)

  • module:模块的名称

<强> moduleDone
(在每次测试结束时调用)

  • module :(字符串)模块的名称
  • 失败:(int)失败的断言计数(模块中所有测试的总计)
  • 传递:(int)成功的断言计数(模块中所有测试的总计)
  • total:(int)模块中所有断言的计数

实施例

// There's probably a more elegant way of doing this, 
// but these two methods will add a row to a table for each test showing how long
// each test took.  
var profileStartTime = null;

function startTimer(details) {
  profileStartTime = new Date();
}

function stopTimer(details) {
  var stopDate = new Date();
  var duration = stopDate - profileStartTime;
  jQuery('#profiling').append(
    "<tr><td>" 
    + (details.module ? details.module + ":" : "") 
    + details.name 
    + "<\/td><td class='duration'>" 
    + duration 
    + "<\/td><\/tr>");
}

QUnit.testStart(startTimer);
QUnit.testDone(stopTimer);

上面引用的我的html表如下所示:

<div style='margin: 10px 0;'>
  <table summary='profiling' class='profiling_table'>
    <thead>
    <tr>
      <th>Test Name</th>
      <th>Duration</th>
    </tr>
    </thead>
    <tbody id='profiling'>
    </tbody>
  </table>
</div>

答案 1 :(得分:5)

  每当新的测试批次断言开始运行时,都会调用

QUnit.testStart(name)name是测试批次的字符串名称。

有关详细信息,请参阅the documentation

答案 2 :(得分:3)

Perry Tew的回答帮助我为自己解决了这个问题,如果有人有兴趣,我写了一个封装的事件对象,它将为你设置所有事件。见下文:

请注意,console.log()不适用于所有浏览器!

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.21/jquery-ui.min.js"></script>    
<script src="lib/qunit-1.9.0.js"></script>
<script src="lib/jquery.mockjax.js"></script>

<!-- QUnit Events -->
<script>

    var testSetup = {

        begin       : function (data) /* before any tests start */ {
            console.log("begin: [" + new Date().toLocaleTimeString() + "]");
        },
        moduleStart : function (data) /* before the start of each module */ {
            console.log("-------\n  moduleStart:", data.name);
        },
        testStart   : function (data) /* before the start of each test */ {
            console.log("    testStart:", data.name);
        },
        log         : function (data) /* called after every assertion */ {
            console.log("      log:", data.message);
        },
        testDone    : function (data) /* after each test */ {
            console.log("    testDone:", data);
        },
        moduleDone  : function (data) /* after each module */ {
            console.log("  moduleDone:", data);
        },
        done        : function (data) /* all tests done */ {
            console.log("done:", data);
        },

        init : function () {
            QUnit.begin = testSetup.begin;
            QUnit.moduleStart = testSetup.moduleStart;
            QUnit.testStart = testSetup.testStart;
            QUnit.log = testSetup.log;
            QUnit.testDone = testSetup.testDone;
            QUnit.moduleDone = testSetup.moduleDone;
            QUnit.done = testSetup.done;
            console.log("\n======== QUnit events initialized ==========");
        }
    };

$(document).ready(testSetup.init);
</script>