2013-12-03 2 views
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 возвращает неопределенное значение, я хочу, чтобы это возвращать массив функций, любые указатели?

EDIT: Кажется, я решил проблему, вместо того, чтобы щелкнуть по возврату функции, создав helper.queue = [] и нажав на функцию, созданную clickOn, в эту очередь. Что я могу получить доступ из makeTest

ответ

0

Есть два пути сделать это, один прототипирования вашей функции, а другой, чтобы создать следующее, которая является самым простой для вашей цели:

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

Прототип маршрут будет означает создание нового вспомогательного метода для использования его прототипированных функций, что отлично подходит для правильной работы области, но в вашем случае это действительно не нужно.

+0

Я не уверен, что следую за вами, у меня есть вспомогательный объект с теми функциями, которые уже определены. clickOn уже успешно создает функцию, которая щелкает элемент, с чем я сталкиваюсь, затем получает доступ к этим функциям в makeTest. – Quirkles

+0

Извините, я думаю, что, возможно, у меня скрестились провода, вы можете настроить скрипку, и я посмотрю, смогу ли я помочь –

+0

, здесь не нужно, я решил проблему, создав хелпер.акту и сохранив там свои функции, спасибо, хотя – Quirkles

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 существует только для «имитации» асинхронности тестовых функций.

+0

прав, но все дело в том, что я хочу иметь возможность писать тесты, просто имея список функций и выполняя их один за другим, это платформа, которую другие люди будут использовать, и ее расширение рамки, так, что важно, что модульные тесты можно написать: теста ("папка для копирования с помощниками", функция() { helpers.makeTest (функция() { helpers.clickOn ("# openDialogFolder"); хелпер .clickOn ("input # -2"); helpers.clickOn ("a # copyTrigger"); }); }); – Quirkles

0

Способ, которым я решил это, состоял в том, чтобы повторно написать функцию clickOn, чтобы вместо возврата функций она переместила функцию в очередь, которая makeTest выполняется один за другим.

Смежные вопросы