2009-12-31 2 views
0

Класс NSInvocation не предназначен для вызова через модульные тесты (для iPhone)?Невозможно вызвать NSInvocation из производного класса SenTestCase?

Моя цель заключается в вызове метода класса за обобщенно и поскольку метод имеет более 2-х параметров, я не могу использовать [myTestClass performSelector:withObject:withObject]

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

2009-12-31 11:12:16.380 otest[2562:903] ******* ABOUT TO CALL NSInvocation /Developer/Tools/RunPlatformUnitTests.include: line 415: 2562 Bus error
"${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}" /Developer/Tools/RunPlatformUnitTests.include:451: error: Test rig '/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/ iPhoneSimulator3.1.2.sdk/Developer/usr/bin/otest' exited abnormally with code 138 (it may have crashed).

Мой класс под тест:

@implementation MyExampleClass 
-(void)methodWithArgs:(NSString *)aValue 
      secondParam:(NSString *)aSecond 
      thirdParam:(NSString *)aThird 
{ 
    NSLog(@"methodWithArgs reached"); 
} 
-(void)methodBlank 
{ 
    NSLog(@"methodBlank reached"); 
} 
-(void)isTesting 
{ 
    NSLog(@"isTesting reached"); 
} 
@end 

Мой блок тест:

@interface MyClassTests : SenTestCase 
{ 
}  
@end 

@implementation MyClassTests 

- (void)testNSInvocation 
{ 
    Class probeClass = NSClassFromString(@"MyExampleClass"); 
    if (probeClass != Nil) {   
     SEL selector = NSSelectorFromString(@"isTesting"); 

     NSMethodSignature *sig = [probeClass methodSignatureForSelector:selector]; 

     // the following line causes the error 
     NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig]; 

     // this variation also fails 
     NSMethodSignature *sig2 = [probeClass 
     methodSignatureForSelector:@selector(methodWithArgs:secondParam:thirdParam:)]; 

     NSInvocation *inv2 = [NSInvocation invocationWithMethodSignature:sig2]; 
    } 
} 
@end 

Каков способ вызова метода с более чем двумя параметрами во время выполнения? Должен ли я изменить подпись метода, так что у него есть только 2 параметра? Является ли это ограничением рамки единичного тестирования?

ответ

0

Причина, по которой вышеуказанный отказ, действительно вызвана неправильным селектором.

Вместо использования «methodSignatureForSelector», мне нужно указать: «instanceMethodSignatureForSelector»

поскольку методы являются методами экземпляра.

Тем не менее, оба ваших ответа были полезны при отслеживании проблемы.

+0

Рад, что вы это поняли! –

1

NSInvocation должен работать нормально в тестовом жгуте. SenTest вообще не смущает.

2562 Bus error

Это указывает на то, что процесс разбился. Жесткий.

Запустите тестовый жгут в отладчике и возьмите трассировку стека. Вне рук, я бы предложил вам протестировать, чтобы убедиться, что sig не равен нулю.

0

Вы используете правильный селектор? Вы указали, что тест будет вызывать метод isTesting в MyExampleClass, без аргументов ... например, примечания bbum, кажется вероятным, что селектор неправильный, и поэтому sig равен нулю, а затем создание вызова умирает. Вы должны хотя бы проверить это дело и не звонить, если это так.

+0

Я добавил код, чтобы показать, как выглядит мой класс под тестированием. Я думаю, что правильно вызываю селектор, а также опробовал второй селектор, который ссылается на метод с несколькими аргументами. Оба они создают ошибки (один набор прокомментирован, когда я пытаюсь другой) –

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