我在测试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
答案 0 :(得分:3)
有两种不同的iOS测试方法。 应用程序测试和逻辑测试。两者对您设置目标的方式都有不同的含义。你不能混合它们,你必须决定两种范式。当你使用框架和Realm时,你必须使用前者。
如果它是一个与之关联的动态库,它们通常会链接到您的应用(由构建设置BUNDLE_LOADER
标识)。在运行时,他们加载测试主机(TEST_HOST
),这通常是您的应用程序可执行文件,它首先在模拟器中启动。他们通过dyld
注入构建的测试包,以便您可以有效地使用每个符号,这些符号在您的应用程序中可以传递。如果您在Xcode中设置新的测试目标,那么现在是默认设置。
要采用此方法,您不得与测试目标共享应用目标代码的目标成员资格。但您需要确保所有模型文件仍然是应用目标的成员。
因此,文件Object.swift
的目标成员资格可能如下所示:
或者:
使用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回答有帮助,但我自己设法解决了。我把它搞砸了,也许这会帮助别人。
您的所有.m
文件应仅位于主应用目标中,而不是测试目标中
使用以下podfile
结构:
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
。它是自动生成的文件,每个目标都有自己的名称。因此,您需要删除对它的所有引用,而是在预编译头中使用该头,如下所示:
#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
添加到主目标。
这对我有帮助。