Ссылка два или более SenTestCase
Я пытаюсь изменить существующий метод defaultTestSuite, чтобы создать класс, который может выбирать методы тестирования из разных классов и выполнять их в определенном порядке. Однако каждый раз, когда я импортирую тестовый файл в другой тестовый файл, я получаю ошибку компоновщика
duplicate symbol _OBJC_METACLASS_$_TMKTestExample
Почему это происходит с OCUnit, как я могу это исправить?
С уважением
2 ответа
Я нашел решение, создав свои собственные NSInvocations в методе testInvocation, который принадлежит SenTestCase.
По сути, у меня есть пустой тестовый класс, который я выбрасываю тестовые методы, которые выполняют какое-то действие (для потокового тестирования), которые настраиваются в каждой NSInvocation, после запуска теста методы будут выполняться в том же порядке, что и в статической testInvocation. Метод, и он позволяет добавлять как можно больше методов в нечто похожее на грубый пример ниже:
Расширить класс SenTestCase
- (id) initWithInvocation:(NSInvocation *)anInvocation
{
id invocationTarget = anInvocation.target;
self = [super initWithInvocation:anInvocation];
if (!self) {
return nil;
}
if (invocationTarget != nil && invocationTarget != self) {
anInvocation.target = invocationTarget;
}
return self;
}
Необходимо переопределить метод выше, потому что цель всегда будет установлена на себя в методе super initWithInvocation.
+(NSArray *) testInvocations
{
NSMutableArray *invocations = (NSMutableArray *)[super testInvocations];
TMKTestFirstViewControllerBaseAction *baseAction = [TMKTestFirstViewControllerBaseAction sharedInstance];
for (int i=0; i<4; i++) {
NSInvocation *invocation = nil;
switch (i) {
case 3:{
invocation = [NSInvocation invocationWithTarget:baseAction selector:@selector(tapChangeBackgroundButton)];
break;
}
case 2:{
invocation = [NSInvocation invocationWithTarget:baseAction selector:@selector(tapChangeBackgroundButton)];
break;
}
case 0:{
invocation = [NSInvocation invocationWithTarget:baseAction selector:@selector(tapBarButtonWithAccessibilityLabel:)];
NSString *arg = @"Second";
[invocation setArgument:&arg atIndex:2];
break;
}
case 1:{
invocation = [NSInvocation invocationWithTarget:baseAction selector:@selector(tapBarButtonWithAccessibilityLabel:)];
NSString *arg = @"First";
[invocation setArgument:&arg atIndex:2];
break;
}
default:
break;
}
[invocation retainArguments];
NSLog(@"invocation target: %d target: %@", i,invocation.target);
[invocations insertObject:invocation atIndex:i+1];
}
return invocations;
}
В приведенном выше примере добавлен только один тест, но можно понять, что я имею в виду, это было взято из примеров на следующих веб-сайтах:
параметрические тесты: http://briancoyner.github.io/blog/2011/09/12/ocunit-parameterized-test-case/
nsinvocation instatiation: https://github.com/aleph7/a-coding/blob/master/ObjC/Invocations/NSInvocation%2BConstructors.m
Используя оба из них и управляя порядком тестов, я могу создать следующее для KIF: - Классы, описывающие действия для тестирования в определенном UIViewController/UIView/ и т. Д., А затем повторно использовать методы для создания потоковых тестов, регрессионного интерфейса тесты, из кода или из скриптов (по-прежнему делает последнее). - нормальные тестовые занятия.
Я надеюсь, что это помогает всем, кто нуждается в этом очень конкретном требовании.
Что касается первоначального вопроса, я не понял его, мне интересно, есть ли способ.
Проверьте свои TMKTestExample
Это целевое членство, оно не должно быть включено как в основную цель, так и в цель модульного тестирования.