所以我正在尝试编写一个帮助编写测试的辅助库,测试以异步方式运行,但我需要强制它们按顺序运行。这是由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访问哪些
答案 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的队列中。