Всички тестови стъпки на KIF извеждат една и съща грешка, какво правя погрешно?

Когато изпълнявам моята KIF цел, независимо как пиша моя KIFTestScenario или KIFTestStep, те връщат следната грешка:

12:20:58.434 - Test that a user can successfully dismiss the welcome screens
12:24:53.208 - FAIL (209.11s): Tap screen at point "{10, 10}"
12:24:53.209 - FAILING ERROR: Error Domain=KIFTest Code=0 "Step threw exception: 
*** -[__NSArrayM insertObject:atIndex:]:
object cannot be nil" UserInfo=0x842c1e0 {NSLocalizedDescription=Step threw exception: *** -[__NSArrayM insertObject:atIndex:]: 
object cannot be nil}
12:24:53.210 - END OF SCENARIO (duration 223.62s)

Както беше предложено, включих кода, който използвам:

TestController.m

#import "TestController.h"
#import "KIFTestScenario+Additions.h"

@implementation TestController

- (void)initializeScenarios;
{
     [self addScenario:[KIFTestScenario scenarioToLogIn]];
}
@end

KIFTestScenario+Additions.m

#import "KIFTestScenario+Additions.h"

@implementation KIFTestScenario (Additions)

+ (id)scenarioToLogIn
{
    KIFTestScenario *scenario = [KIFTestScenario scenarioWithDescription:@"Test that a user can successfully dismiss the welcome screens"];
    KIFTestStep *step = [KIFTestStep stepToTapScreenAtPoint:CGPointMake(10.0f, 10.0f)];
    [scenario addStep:step];
    return scenario;
}
@end

Преминах през дебъгера и KIFTestStep, който добавям към сценария, не е нула и е валиден KIFTestStep.

Някой сблъсквал ли се е с този проблем преди или има някакви мисли за поправка?


person mclaughj    schedule 30.08.2013    source източник
comment
можеш ли да покажеш своя kif код?   -  person abbood    schedule 30.08.2013
comment
Можете ли да включите допълнителен контекст от дневника? Кои бяха редовете, водещи до грешката? Тази грешка е предизвикана от уловено изключение. Можете ли да добавите точка на прекъсване на изключение и да покажете къде е хвърлено изключението? Може да е бил хвърлен във вашия код или KIF.   -  person Brian Nickel♦    schedule 31.08.2013
comment
Brian Nickel: Добавих малко контекст към регистрираната грешка. Що се отнася до изключението, то се хвърля в KIFTestStep.m (ред 852). При отстраняване на грешки около тази област на изпълнение изглежда, че всичко е наред.   -  person mclaughj    schedule 31.08.2013
comment
Линия 852 е мястото, където се хваща, а не мястото, където се хвърля. Точка на прекъсване на изключение ще се активира, когато изключението бъде повдигнато.   -  person Brian Nickel♦    schedule 31.08.2013


Отговори (1)


Това изключение се повдига във вашия собствен код.

Разглеждайки източника на KIF, insertObject:atIndex: се извиква на две места: в addStep: и в KIFTypist.

Вашето изключение възниква при изпълнението на стъпката, така че не е в addStep: и не използвате методите на клавиатурата, така че KIFTypist не се използва.

Това, което вероятно се случва, е, че KIF докосва екрана в този момент и вашият разпознаващ жест или слушателят на обратно извикване задейства изключението. Това обикновено би сринало приложението ви, но инструментът за обработка на изключения на KIF го е уловил и е съобщил за неуспешния тест. Можете да хванете изключението там, където е повдигнато, като използвате изключение за точка на прекъсване и разберете какво го е причинило.

Струва си да се отбележи, че екранната координата 10, 10 обикновено не може да се използва, защото е в лентата на състоянието. За да докоснете приложението си на 10, 10, трябва да преминете 10, 30.


Актуализация

Според нашата дискусия в коментарите, изключението се повдига в windowsWithKeyWindow, където ключовият прозорец беше nil. Единствената ситуация, при която keyWindow би било nil в типичните приложения, е преди да извикате [self.window makeKeyAndVisible] в делегата на вашето приложение. Трябва да се уверите, че цялата логика за настройка (включително създаване на ключов прозорец) е направена, преди да извикате метода startTestingWithCompletionBlock: на KIF.

person Brian Nickel♦    schedule 30.08.2013
comment
Благодаря за връзката, обясняваща как да използвате изключение за точка на прекъсване. Погрешно съм разбрал какво искаш да кажеш. Въпреки това изглежда, че изключението се хвърля на ред 96 на UIApplication-KIFAdditions.m и не се хвърля от моя код. Все още съм на загуба защо се появява тази грешка. - person mclaughj; 03.09.2013
comment
Можете ли да предоставите въпросната линия? Виждам само 89 реда в този файл - person Brian Nickel♦; 03.09.2013
comment
Интересно, моето локално копие на файла има метод с име dimmingViewWindow точно над windowsWithKeyWindow. Редът, който изглежда хвърля изключение, е ред 84, [windows addObject:keyWindow]; - person mclaughj; 03.09.2013
comment
Добре, трябва да съм имал грешната версия. Това е интересно. Това предполага, че нямате keyWindow. Използвате ли сторибордове? Ако не, обаждате ли се на [self.window makeKeyAndVisible] преди или след startTestingWithCompletionBlock: на KIF? - person Brian Nickel♦; 03.09.2013
comment
Браян, ти си спасител. Преглеждайки моя код, имаше условие за състезание, което можеше да попречи на [self.window makeKeyAndVisible] да бъде уволнен, преди да изпълня своите KIF тестове. Мислите ли, че трябва да отбележа това като правилен отговор? - person mclaughj; 03.09.2013
comment
Благодаря на @BrianNickel за работата ви тук. Проблемът с липсата на keyWindow беше източникът и на моя проблем. Разменяхме отделен тип AppDelegate при тестване, както се вижда тук: stackoverflow.com/questions/28502498/ Този отделен вид AppDelegate клас не конфигурира keyWindow изобщо, оттук и моята катастрофа. Надяваме се, че това е полезно за някого :-) - person Brian Sachetta; 31.08.2018