Ссылка два или более 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;
}

В приведенном выше примере добавлен только один тест, но можно понять, что я имею в виду, это было взято из примеров на следующих веб-сайтах:

Используя оба из них и управляя порядком тестов, я могу создать следующее для KIF: - Классы, описывающие действия для тестирования в определенном UIViewController/UIView/ и т. Д., А затем повторно использовать методы для создания потоковых тестов, регрессионного интерфейса тесты, из кода или из скриптов (по-прежнему делает последнее). - нормальные тестовые занятия.

Я надеюсь, что это помогает всем, кто нуждается в этом очень конкретном требовании.

Что касается первоначального вопроса, я не понял его, мне интересно, есть ли способ.

Проверьте свои TMKTestExampleЭто целевое членство, оно не должно быть включено как в основную цель, так и в цель модульного тестирования.

Другие вопросы по тегам