返回一个函数数组?

3

我正在尝试编写一个助手库,以帮助编写测试。这些测试在异步运行,但我需要强制它们按顺序运行。在我们工作中使用的测试框架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返回的函数只是未定义,我希望它返回一个函数数组,有什么方法吗?

编辑:我似乎已经通过创建helper.queue = [],并将由clickOn创建的函数推送到该队列中来解决了我的问题。我可以从makeTest访问它。

3个回答

0

有两种方法可以实现这个功能,一种是原型设计您的函数,另一种是创建以下内容,这对您的目的来说是最简单的:

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

原型路由意味着实例化一个新的辅助方法来使用其原型函数,这对于正确保持作用域非常有用,但在您的情况下并不是真正需要的。

我不确定我理解你的意思,我已经有一个带有这些函数定义的辅助对象了。clickOn已经成功地创建了一个点击元素的函数,我遇到的问题是在makeTest中访问这些函数。 - Quirkles
抱歉,我可能有点混淆了,请您设置一个 Fiddle,我会看一下能否提供帮助。 - Michael Tempest
没有必要了,我已经通过创建一个 helper.queue 并将我的函数存储在那里来解决了我的问题,谢谢。 - Quirkles

0

如果你想把测试函数和参数放在一个数组中,可以这样做:

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仅用于“模拟”测试函数的异步性。


正确的,但是重点在于我希望通过只有一系列的函数列表并逐个执行它们来编写测试,这是其他人将要使用的框架,它是对现有框架的扩展,因此重要的是能够编写模块化的测试:test("使用helpers复制文件夹", function () { helpers.makeTest(function(){ helpers.clickOn("#openDialogFolder"); helpers.clickOn("input#-2"); helpers.clickOn("a#copyTrigger"); }); }); - Quirkles

0
我解决这个问题的方法是重新编写clickOn函数,使其不再返回函数,而是将函数推入队列中,由makeTest逐个执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接