在iOS逻辑testing中使用CocoaPods时没有find库

我正在尝试写一些iOS逻辑testing对我的项目中使用我的podspec中的一些库function的类。 我正在使用Xcode提供的标准unit testing包(虽然不是应用程序testing,只是unit testing)。

例如,我使用魔法logging,并且在podspec中链接了该库。 它存在于我工作区的Pods项目中,并且在应用程序在模拟器或设备上运行时按预期工作。 当我试图链接到testing使用魔法logging的对象,但是,我得到一个链接器错误,指出它无法从魔法loggingfindselect器。 我已经尝试更新我的逻辑testing包中的HEADER_SEARCH_PATH,甚至将其编码到由CocoaPods创build的头文件目录中,但没有运气。

我可以针对没有使用CocoaPods库的类运行unit testing。

我是否在谈论这个错误? 我应该做一些其他的事情来让编译器看到CocoaPods库吗?

CocoaPods 1.0目前处于testing阶段,并已经改变了语法。 现在看起来像这样:

def shared_pods pod 'SSKeychain', '~> 0.1.4' ... end target 'Sail' do shared_pods end target 'Sail-iOS' do shared_pods end 

预CocoaPods 1.0的答案

你想使用的是来自你的Podfile 。 就像是:

 link_with 'MainTarget', 'MainTargetTests' 

然后再次运行pod install

我想通过看看我的应用程序的主要目标是从CocoaPods库接收设置。 CocoaPods包含一个名为Pods.xcconfig的.xcconfig文件。 该文件包含所有的标题searchpath。

如果您在项目导航器中查看项目,然后单击“信息”选项卡,则会在顶部显示您的构buildconfiguration。 如果您为不同的configuration打开显示三angular形,则会在您的主要目标下方看到豆荚。 我不得不点击下拉菜单并将Pod添加到逻辑testing目标。

配置快照

我还必须从我的主目标复制$(inherited)${PODS_HEADERS_SEARCH_PATHS}的设置,并将其复制到构build设置/ HEADER_SEARCH_PATHS下的逻辑testing目标。

最后,我必须添加libPods.a链接二进制与我的逻辑testing目标的库生成阶段。

希望这是能够帮助别人。

有一个我在这里find的解决schemeunit testing用CocoaPods :

在Xcode中打开项目文件,然后select项目(不是目标),在右侧面板中有一个名为Configurations的部分。 在“基于configuration文件”列中为您的testing目标select豆荚。

在这里输入图像说明

我同意其他答案,说明有必要把图书馆链接到testing目标。 然而,迄今为止,没有任何build议帮助我。 正如@fabb在评论中写道:“当testing时, isSubclassOfClass:调用返回NO,他们应该返回YES。我唯一可以解释的原因是依赖关系确实与主目标和testing目标链接,当testing目标的捆绑加载器加载主包,它不能决定采取哪个类。“ 我在这个线程中遇到了所有以前的build议的同样的问题。

我得到的解决scheme是更新我的Podfile来为我的主要目标和我的testing目标定义特定的Pod:

 target 'MyTarget' do pod 'AFNetworking', '~> 2.5.0' pod 'Mantle', '~> 1.5' end target 'MyTargetTests' do pod 'OCMockito', '~> 1.3.1' end 

即使我没有使用任何testing特定的Pod,也需要为我的testing目标指定一个Pod。 否则CocoaPods将不会在我的项目中插入必要的链接逻辑。

这个链接帮助我得出这个结论。

我添加了:exclusive => true以避免应用程序testing目标中出现重复的符号错误。

 target 'myProjectTests', :exclusive => true do pod 'OCMock', :head pod 'XCTAsyncTestCase', :git => 'https://github.com/iheartradio/xctest-additions.git' end link_with 'myProject', 'myProjectTests' 

当我将应用程序testing目标更改为逻辑unit testing目标时,会发生链接器错误。 我删除后:exclusive => true ,一切工作再次。

 target 'myProjectTests', do pod 'OCMock', :head pod 'XCTAsyncTestCase', :git => 'https://github.com/iheartradio/xctest-additions.git' end link_with 'myProject', 'myProjectTests' 

:exclusive => true表示不应该链接到myProjectTests ,这在应用程序testing目标中是合理的,但它会导致逻辑testing目标中的链接器错误。

根据@Keith Smiley解决scheme,您可以使用link_with。

如果你有共同的豆荚,每个目标的具体细节,你可能想要使用“def”选项来定义豆荚组。 并在以后的专用目标中使用“def”。

 def import_pods pod 'SSKeychain' end target 'MyProjectTests', :exclusive => true do import_pods end target 'MyProject', :exclusive => true do import_pods pod 'Typhoon' end 

在上面的例子中,我添加了“SSKeychain”这两个目标,“台风”只添加到“MyProject”目标

我对这个问题的解决scheme是改变我的Podfile,把库包含在这两个目标中

 target "MyApp" do pod 'GRMustache', '~> 7.0.2' end target "MyAppTests" do pod 'GRMustache', '~> 7.0.2' end 

而且由于我使用的是swift,我还必须configurationtesting目标以包含MyApp-Bridging-Header.h文件。 (在Build Settings标签下的Swift Compiler组中)

当我在某些版本控制期间丢失了一些库文件时,发生了类似的情况。 我仍然在我的Pod中看到了这个库文件,但是实际的代码丢失了,XCode说它已经不存在了。 令我沮丧的是,运行“pod install”并不是立即把丢失的文件带回来。

我必须通过执行以下操作手动移除并更换吊舱:

  1. 从Podfile中移除库
  2. 运行“pod install”以完全删除库
  3. 把库放回Podfile
  4. 再次运行“pod install”

这应该使图书馆回到原来的forms。

还值得注意的是,如果你有libPods.a两次,你会得到这样一个讨厌的错误:

 232 duplicate symbols for architecture i386 

要解决这个问题,只需在Project Explorer中删除一个libPods.a引用即可。

从CocoaPods 1.x开始,有一种新的方法来声明目标和相应testing目标之间的共享依赖关系。 我一直在使用Mark Struzinski所接受的解决scheme,但在运行我的testing时,使用这种方法产生了大量的警告:

 Class SomeClass is implemented in both /Path/To/Test/Target and /Path/To/App/Target. One of the two will be used. Which one is undefined. 

使用CocoaPods 1.x,我们可以将我们的-Test目标声明为通过父目标的searchpathinheritance,如下所示:

 target 'MyApp' do pod 'aPod' pod 'anotherPod' project 'MyApp.xcodeproj' end target 'MyAppTests' do inherit! :search_paths project 'MyApp.xcodeproj' end 

这将导致-Test目标有权访问应用程序目标的依赖项,而不需要多个二进制副本。 这已经严重加快了testing生成时间。

我正在使用Google Swift应用与iOS上的GoogleMaps Objective-C POD集成,所以对于我来说,问题是testing目标没有在构build设置中引用桥头文件( SWIFT_OBJC_BRIDGING_HEADER )。 确保您的应用程序和testing应用程序目标都指向了这一点,以便第三方API调用(地图API等)可用于快速unit testing。

下一个语法给我最好的结果(在cocoapod v.1.2.1下testing):

https://github.com/CocoaPods/CocoaPods/issues/4626#issuecomment-210402349

  target 'App' do pod 'GoogleAnalytics' , '~> 3.0' pod 'GoogleTagManager' , '~> 3.0' pod 'SDWebImage', '~>3.7' platform :ios, '8.0' use_frameworks! target 'App Unit Tests' do inherit! :search_paths end end 

没有这个,我有警告,而testing运行有关重复的符号。

此警告消失后。