返回一组函数?

时间:2013-12-03 16:49:21

标签: javascript wrapper

所以我正在尝试编写一个帮助编写测试的辅助库,测试以异步方式运行,但我需要强制它们按顺序运行。这是由funcunit完成的,我们在工作中使用的测试框架是使用嵌套回调,但最终会有30层深度,难以编写,难以维护等等。

我有一些辅助函数,makeTest和clickOn:

helpers.makeTest = function (f) {
    if(!helpers.tests)
        helpers.tests = //I want this to be an array of the functions returned by clickOn//;

    if(helpers.tests.length)
    {
        helpers.tests.shift()();    
    }
    else
    {
        ok(true, 'Tests passed');
    }
};



helpers.clickOn = function() {
    var args = Array.prototype.slice.call(arguments),
        selector = args.shift();

    return function() {
        var el = S(selector);
        el.exists(function(){
            S.wait(100, function(){
                el.click(function(){ 
                    helpers.makeTest();
                });
            });
        });
    }
}

我希望能够编写如下测试:

test("copy folder with helpers", function () {
    helpers.makeTest(function(){
        helpers.clickOn("#openDialogFolder");
        helpers.clickOn("input#-2");
        helpers.clickOn("a#copyTrigger");
    });
});

然而,所有发生的事情都是传递给makeTest的函数返回undefined,我希望这返回一个函数数组,任何指针?

编辑:我似乎已经解决了我的问题,而不是让clickOn返回一个函数,创建一个helper.queue = []并将clickOn创建的函数推送到该队列。我可以从makeTest访问哪些

3 个答案:

答案 0 :(得分:0)

有两种方法可以做到这一点,一种是为你的功能进行原型设计,另一种是创建以下最简单的方法:

helpers = {
    clickOn: function () {},
    makeTest: function () {}
}

原型路线意味着实例化一个新的辅助方法来使用它的原型函数,这对于保持适当的范围非常有用,但在你的情况下并不是真的需要。

答案 1 :(得分:0)

要将您的testsfunctions +参数放在数组中,您可以这样做:

tests = [ // global variable
 [ helpers.clickOn, "#openDialogFolder" ],
 [ helpers.clickOn, "input#-2" ],
 [ helpers.clickOn, "a#copyTrigger" ],
 [ more_fkts, "other arg", 42 ]
]

并运行测试

function runNextTest() {

 var test = tests.shift;
 if(test) {

    window.setTimeout(function() {
      var args = Array.prototype.slice.call(test, 1);
      test[0].apply(null, args);
      runNextTest();
    }, 1);
   }
  }
但是,为了解释测试函数中涉及的异步方式,可能必须调整调用机制。 - setTimeout只用于“模拟”测试函数的异步性。

答案 2 :(得分:0)

我解决这个问题的方法是重新编写clickOn函数,这样它就不会返回函数,而是将函数推送到一个逐个执行makeTest的队列中。