1

我想编写一个辅助函数,它要么断言作为参数给出的测试函数,要么默认调用 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 个断言时测试通过。

4

1 回答 1

0

问题是 nodeunit将每个断言包装在一些逻辑中,以跟踪在测试用例中完成的所有事情。Expect设置预期的断言数量,当done被调用时,它会简单地检查实际运行的断言数量是否符合您的预期

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

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函数返回一个测试对象的断言方法。

要使用它,您将当前测试对象传递给工厂方法,该方法将返回您需要的断言。这样您就可以获得当前断言的正确上下文。

我猜你可以认为是getTestMethodassertionFactoryFactory但这听起来太邪恶了

于 2014-12-06T19:56:27.533 回答