Единичен тест на NSNotification, който се изпраща асинхронно от NSTimer

От няколко дни се опитвам да разбера как да тествам своя API с GHUnit. Сега стигнах до проблема, за да тествам това:

API получава няколко входа, CUT прави нещо и стартира NSTimer. След като таймерът се задейства, той изпраща NSNotification с някои потребителски данни. Ясно е как да тествам данните на userInfo, но това, което искам да тествам, е дали известието се изпраща само ако някои определени обстоятелства са верни и ако не, не трябва да се изпраща изобщо.

Как мога да го тествам, е съвсем ясно, след като прочетох това: http://www.hpique.com/2013/12/nsnotificationcenter-part-3/

Но сега се появява логичният проблем: Асинхронното поведение на CUT с изпращане на NSNotification след задействане на NSTimer. Когато сега чакам при всеки тест таймерът да се задейства, тестовете ми ще станат много бавни.

Как мога да тествам поведението, без винаги да чакам NSTimer да се задейства? Имате ли идеи


person copydigital    schedule 21.10.2015    source източник
comment
И така, вашият въпрос всъщност е дали е възможно да се извършат един или повече асинхронни тестове едновременно и дали има такова нещо като асинхронен тест`?   -  person CouchDeveloper    schedule 21.10.2015
comment
Повече или по-малко. Действителната идея е да се отървем от таймера, за да направим асинхронния тест синхронен тест, който може да бъде тестван доста лесно. И ако това не е възможно, как да тествате това асинхронно поведение по правилния начин и да не получавате бавни тестове.   -  person copydigital    schedule 21.10.2015


Отговори (1)


Не знам начин да изпълнявам синхронни тестове едновременно с XCTest от Xcode. Разбира се, можете да дефинирате няколко тестови проекта и да ги стартирате едновременно от конзолата. Но предполагам, че това не е това, което търсите.

Един асинхронен тест би изисквал тестовият метод да се върне преди твърденията да бъдат тествани, но ще бъде тестван в крайна сметка. Изпълнител на тестове ще трябва да знае за асинхронните тестове, за да ги обработва правилно.

С XCTest не е възможно да имате асинхронен тест. Има намеци в документацията на изходния код, което ме кара да вярвам, че това вероятно изобщо не е възможно:

В описанието на waitForExpectationsWithTimeout се казва:

"-waitForExpectationsWithTimeout:handler: създава точка на синхронизация в потока на тест. Само един -waitForExpectationsWithTimeout:handler: може да бъде активен във всеки даден момент, но множество дискретни последователности от {expactations -> wait} могат да бъдат верижни заедно."

"waitForExpectationsWithTimeoutизпълнява цикъла за изпълнение, докато обработва събития, докато всички очаквания не бъдат изпълнени или времето за изчакване бъде достигнато. Клиентите не трябва да манипулират цикъла за изпълнение, докато използват този API."

Така че само един waitForExpectationsWithTimeout:handler: може да бъде активен и ние не трябва да променяме основния цикъл на изпълнение -- това съвсем ясно показва, че не можем да изпълняваме тестове асинхронно.

Забележка: можете да тествате асинхронни методи или функции в тестовия метод. В XCTest обаче самият тестов метод винаги е синхронен - тъй като изчаква резултатът да стане достъпен.

person CouchDeveloper    schedule 21.10.2015
comment
Да, чух някои слухове за този факт, че XCTest е малко безполезен в този специален случай. И дори GHUnit няма опция за това, нали? - person copydigital; 21.10.2015
comment
GHUnit заявява, че може да изпълнява тестове паралелно. Освен това има GRUnit, който изглежда подобрява асинхронното тестване. Не съм запознат обаче с тези тестови рамки. За да получите по-добра помощ, трябва да публикувате своя код. - person CouchDeveloper; 21.10.2015
comment
Защо да не стартирате всичко в рамките на един тестов случай и да използвате времеви очаквания? Постигате почти същото с по-малко усилия. - person Ben Affleck; 22.10.2015