如何使用新的断言函数扩展QUnit?

时间:2013-10-19 22:44:44

标签: javascript unit-testing qunit

我想向QUnit添加新的断言。 我做了一件事:

QUnit.extend(QUnit.assert, {
  increases: function(measure, block, message){
    var before = measure();
    block();
    var after = measure();
    var passes = before < after;
    QUnit.push(passes, after, "< " + before, message);
  }
});

当我在测试中使用increases(foo,bar,baz)时,我得到了

  

ReferenceError:未定义增量

在浏览器控制台中,我可以看到increases中的QUnit.assert以及所有其他标准功能:okequaldeepEqual

从控制台运行:
test("foo", function(){console.log(ok) });
我看到了ok的来源。

运行:
test("foo", function(){console.log(increases) });
我被告知增加没有定义。

在测试中使用增加所需的魔力是什么?此外,哪里(如果有的话)是文件?

由于

2 个答案:

答案 0 :(得分:5)

我发现解决方案是接受测试回调函数中的参数。该参数将具有额外的断言类型。所以我们可以这样称呼它:

//the assert parameter accepted by the callback will contain the 'increases' assertion
test("adding 1 increases a number", function(assert){
    var number = 42;
    function measure(){return number;}
    function block(){number += 1;}
    assert.increases(measure, block);
});

答案 1 :(得分:2)

我今天尝试添加自定义断言并遇到了同样的问题。 仅在全局对象中定义原始断言函数。自定义断言不是。

从调试QUnit代码看,原始断言函数似乎是故意放在全局作用域 - 窗口变量上。这在QUnit的初始化时发生,因此它仅适用于当时已定义的原始断言函数。

1.QUnit.js:原始断言函数的定义

assert = QUnit.assert = {
  ok: function( result, msg ) {

...

2.QUnit.js:原始断言功能 - &gt; QUnit.constructor.prototype

extend( QUnit.constructor.prototype, assert );

3.QUnit.js:QUnit.constructor.prototype - &gt;窗口

// For browser, export only select globals
if ( typeof window !== "undefined" ) {
    extend( window, QUnit.constructor.prototype );
    window.QUnit = QUnit;
}

<强>解决方案

所以当你回答时,为了使用自定义断言功能,需要:

  1. 捕获传递给每个断言函数的assert参数并使用它。 恩。

    test("test name", function(assert) {
      assert.cosutomAssertion(..); 
    ...});
    
  2. 或使用完整命名空间来访问断言函数。 恩。

    QUnit.assert.customAssertion(..)