【问题标题】:How to write a vows js bdd test for an asynchronous recursive operation如何为异步递归操作编写 vows js bdd 测试
【发布时间】:2013-11-13 02:45:54
【问题描述】:

代码.js

var Util = function(){
    function factorial(n, callback){
        if(n == 1){
           return n;
        } else {
           return n*factorial(n-1, callback);
        }
        /*callback(returnValue); */ // Where should this line go?
    }

    return{
      factorial: factorial
    };
};

exports.Util = Util;

Test.js

var vows = require('vows'),
    assert = require('assert'),
    Util = require('./Code').Util;

var u = new Util();


vows.describe('Testing Utils').addBatch({
     'Test Factorial async':{
          topic: function(){
                u.factorial(5, this.callback);
           },
          'The output must be 120': function(result, ignore){
              assert.equal(result, 120);
           }
      }
}).run();

在 node.js 上运行

> node Test.js

我得到错误回调未触发。

如果我能够放置这个脚本,我的理解是在我的函数返回之前: callback(computeValue); 恕我直言,这应该可以工作。如果我错了,请纠正我。 但是,我不明白我可以在哪里插入这个。 感谢您的宝贵时间!

【问题讨论】:

  • @Downvoter 需要解释一下吗?

标签: javascript node.js asynchronous recursion vows


【解决方案1】:

首先,您的代码不是异步的,您需要使用 process.nextTick 或 setImmediate,在当前情况下,测试用例应该如下所示:

code.js

var Util = function () {
    this.factorial = function (n) {
        if (n == 1) {
            return n;
        } else {
            return n * this.factorial(n - 1);
        }
    }
};

exports.Util = Util;

test.js

var vows = require('vows'),
    assert = require('assert'),
    Util = require('./code').Util;

vows.describe('Testing Utils').addBatch({
    'Test Factorial async': {
        topic: new Util,
        'The output must be 120': function (util) {
            assert.equal(util.factorial(5), 120);
        }
    }
}).run();

【讨论】:

  • 嗨,micnic,感谢您抽出宝贵时间...谈到我在问题中的示例,我将不得不写一个声明callback(returnValue)...如何将其插入到您描述的位置? ...您建议returnValue 应该是什么?当我使用你的阶乘函数时……vows 会抛出一个错误:callback not fired
【解决方案2】:

经过反复试验,我现在可以应用递归了:

这个想法是将你的计算包装在一个函数中,以便在计算完成后可以触发callback(retVal)

function factorial(n, callback){ 
    var retVal = (
           function anonymous(num) { // note it is necessary to name this anonymous function to
                              // be able to call recursively
               return (num == 1 ? num : num*anonymous(num -1));
           }
    )(n); // immediately execute with n;

// callback with retVal;
callback(retVal);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多