链接两个或更多SenTestCase

时间:2014-02-10 15:44:55

标签: ios objective-c ocunit

我正在尝试更改现有的defaultTestSuite方法来创建一个类,该类可以从不同的类中选择测试方法并按特定顺序执行它们。 但是每次我在另一个测试文件中导入测试文件时都会出现链接器错误

duplicate symbol _OBJC_METACLASS_$_TMKTestExample

为什么OCUnit会发生这种情况,我该如何解决这个问题?

此致

2 个答案:

答案 0 :(得分:0)

检查您的TMKTestExample目标成员资格,它不应包含在主要目标和单元测试目标中。

答案 1 :(得分:0)

我通过在属于SenTestCase的testInvocation方法中创建自己的NSInvocations来找到解决方案。

基本上我有一个空的测试类,我抛出执行某些操作的测试方法(用于流测试),这些操作在每个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;

}

有必要覆盖上面的方法,因为目标将始终在超级initWithInvocation方法中设置为self。

+(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 / etc中测试的操作的类,然后重用这些方法从代码或脚本(仍在执行后者)中创建流测试,回归UI测试。 - 正常的考试课程。

我希望这可以帮助那些需要这个特定要求的人。

关于原始问题,我还没弄明白,我想知道是否有办法。