Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何为异步递归操作编写vows js bdd测试_Javascript_Node.js_Asynchronous_Recursion_Vows - Fatal编程技术网

Javascript 如何为异步递归操作编写vows js bdd测试

Javascript 如何为异步递归操作编写vows js bdd测试,javascript,node.js,asynchronous,recursion,vows,Javascript,Node.js,Asynchronous,Recursion,Vows,Code.js Test.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 lin

Code.js

Test.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;
在node.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();
我得到的错误回调没有被触发

我所理解的是,如果我能够将以下脚本放置在函数返回之前:
回调(computeValue)这应该在IMHO中起作用。如果我错了,请纠正我。
但是,我不明白在哪里可以插入此内容。

谢谢你的时间

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

code.js

> node Test.js
test.js

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

exports.Util = Util;

经过一点尝试和错误,我现在能够应用递归:

其思想是将您的计算封装在一个函数中,以便在计算完成后可以触发
回调(retVal)

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抛出一个错误:
回调未被激发
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);
}