具有相同名称的RLMObject子类不能在同一目标

时间:2015-11-17 06:21:50

标签: ios realm

我在测试Realm方面遇到了问题。如果我确实将我的目标文件包含到测试目标中,则在执行测试时会出现此错误:

   file:///path/project-iOS/project-iOS/DataManager.m: test failure: -
    [SingleHouseDb_Test testPerformanceExample] failed: failed: caught
     "RLMException", "RLMObject subclasses with the same name cannot be
     included twice in the same target. Please make sure 'StringObject' is only linked
     once to your current target."

但是,如果我从目标中删除文件,它根本无法构建!

 Undefined symbols for architecture x86_64:
      "_OBJC_CLASS_$_DVMap", referenced from:
          objc-class-ref in DataManager.o
      "_OBJC_CLASS_$_DVHouse", referenced from:
          objc-class-ref in DataManager.o
      "_OBJC_CLASS_$_DVReport", referenced from:
          objc-class-ref in DataManager.o
          objc-class-ref in ReportsViewController.o
      "_OBJC_CLASS_$_DVReportPhoto", referenced from:
          objc-class-ref in DataManager.o
      "_OBJC_CLASS_$_DVUserProfile", referenced from:
          objc-class-ref in DataManager.o
          objc-class-ref in ReportsViewController.o
      "_OBJC_CLASS_$_StringObject", referenced from:
          objc-class-ref in DataManager.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)

这是我的Podfile:

platform :ios, '8.0'

use_frameworks!

target 'my-iOS' do
    pod 'AFNetworking'
    pod 'Realm'
    pod 'SDWebImage'
end

target 'my-iOSTests', exclusive: true do
    pod 'Realm/Headers'
end

target 'my-iOSUITests', exclusive: true do
    pod 'Realm/Headers'
end

2 个答案:

答案 0 :(得分:3)

有两种不同的iOS测试方法。 应用程序测试逻辑测试。两者对您设置目标的方式都有不同的含义。你不能混合它们,你必须决定两种范式。当你使用框架和Realm时,你必须使用前者。

应用程序测试

如果它是一个与之关联的动态库,它们通常会链接到您的应用(由构建设置BUNDLE_LOADER标识)。在运行时,他们加载测试主机(TEST_HOST),这通常是您的应用程序可执行文件,它首先在模拟器中启动。他们通过dyld注入构建的测试包,以便您可以有效地使用每个符号,这些符号在您的应用程序中可以传递。如果您在Xcode中设置新的测试目标,那么现在是默认设置。

目标会员资格

要采用此方法,您不得与测试目标共享应用目标代码的目标成员资格。但您需要确保所有模型文件仍然是应用目标的成员。

因此,文件Object.swift的目标成员资格可能如下所示:

Target Membership App Only

或者

Target Membership Framework Only

的CocoaPods

使用CocoaPods,你的Podfile应该是这样的:

platform :ios, '8.0'

use_frameworks!

target 'my-iOS' do
    link_to 'my-iOS', 'my-iOSTests', 'my-iOSUITests'
    pod 'AFNetworking'
    pod 'Realm'
    pod 'SDWebImage'    
end

标题子规范用于使用静态链接时的逻辑测试方法。

请同时查看Realm文档中有关Avoid Linking Realm and Tested Code in Test Targets

的章节

答案 1 :(得分:0)

好的,@marius回答有帮助,但我自己设法解决了。我把它搞砸了,也许这会帮助别人。

  1. 您的所有.m文件应仅位于主应用目标中,而不是测试目标中

  2. 使用以下podfile结构:

  3. platform :ios, '8.0'
    
    use_frameworks!
    
    target 'myPoject-iOS' do
        pod 'AFNetworking'
        pod 'Realm'
        pod 'SDWebImage'
    end
    
    target 'myPoject-iOSTests', exclusive: true do
        pod 'Realm/Headers'
    end
    
    target 'myPoject-iOSUITests', exclusive: true do
        pod 'Realm/Headers'
    end
    

    在此之后一切都应该有效。

    如果你有任何Swift文件,就像我一样,它会变得棘手。它告诉我找不到someheader-Swift.h。它是自动生成的文件,每个目标都有自己的名称。因此,您需要删除对它的所有引用,而是在预编译头中使用该头,如下所示:

    1. 从上面做一切
    2. 对于swift文件,将文件添加到所有目标
    3. 如果您有预编译的标头,请使用它,或者创建一个新标头。使用类似这样的东西:
    4. #if MAIN_TARGET==1
      #import "myProject-Swift.h"
      #elif TESTS_TARGET==1
      #import "myProject_iOSTests-Swift.h"
      #elif UI_TESTS_TARGET==1
      #import "myProject_iOSUITests-Swift.h"
      #endif
      

      您需要链接器/编译器在每个目标上使用正确的文件。为此,您需要向Build Settings - Preprocessor Macros添加一些定义/宏到每个目标。例如,将MAIN_TARGET=1添加到主目标。

      这对我有帮助。