如何为nodeunit中的不同断言函数编写辅助函数

时间:2014-12-02 22:23:18

标签: node.js nodeunit

我想编写一个辅助函数,它可以断言作为参数给出的测试函数,也可以默认调用assert.equal。

运行以下代码时,出现以下错误:Expected 1 assertions, 0 ran

var assert = require('nodeunit').assert;

var interpretTest = function(expression, expected, testFunction) {
    testFunction = testFunction || assert.equal;
    return function(test) {
        test.expect(1);
        testFunction(expression, expected);
        test.done();
    };
};

exports.testEqual = interpretTest([8, 6], [8, 6], assert.deepEqual);

当删除test.expect(1)但是有0个断言时,测试通过。

1 个答案:

答案 0 :(得分:0)

问题是nodeunit wraps each assertion in some logic跟踪测试用例中完成的所有事情。 Expect设置了预期的断言数,当done被调用时,它将simply check that the number of assertions that actually ran is what you expected

由于测试对象被传递给每个测试函数,因此很难从辅助函数更改其状态。我提出了以下解决方案:

var getTestMethod = function(methodName) {
    return function(test) { return test[methodName]; };
};

var equal = getTestMethod('equal');
var deepEqual = getTestMethod('deepEqual');

var interpretTest = function(expression, expected, testMethodFactory) {
    testMethodFactory = testMethodFactory || equal;
    return function(test) {
        var testMethod = testMethodFactory(test);
        test.expect(1);
        testMethod(expression, expected);
        test.done();
    };
};

exports.testNumbers = interpretTest(8, 8);
exports.testArrays = interpretTest([8, 6], [8, 6], deepEqual);

也许你可以找到一种简化方法,但它有效。 getTestMethod返回一个函数,该函数返回测试对象上的一个断言方法。

要使用它,请将当前测试对象传递给factory方法,该方法将返回所需的断言。通过这种方式,您可以获得当前断言的正确上下文。

我猜您可以将getTestMethod视为assertionFactoryFactory,但听起来too evil