使用带有iOS逻辑测试的CocoaPods时找不到库

Mar*_*ski 148 unit-testing ios cocoapods

我正在尝试针对我的项目中的类编写一些iOS逻辑测试,这些类使用podspec中某些库的功能.我正在使用Xcode中提供的标准单元测试包(尽管不是应用程序测试,只是单元测试).

例如,我使用魔法记录,我在podspec中链接了该库.它存在于我的工作区中的Pods项目中,并且当应用程序在模拟器或设备上运行时,可以按预期工作.当我尝试链接到测试使用Magical Record的对象时,我得到一个链接器错误,指出它无法从Magical Record中找到选择器.我已经尝试在我的逻辑测试包中更新我的HEADER_SEARCH_PATH,甚至将它硬编码到CocoaPods创建的headers目录中,但没有运气.

我可以对不使用CocoaPods库的类运行单元测试,没有问题.

我错了吗?我应该做其他事情让编译器看到CocoaPods库吗?

Kei*_*ley 224

CocoaPods 1.0已经改变了这个的语法.它现在看起来像这样:

def shared_pods
    pod 'SSKeychain', '~> 0.1.4'
    ...
end

target 'Sail' do
    shared_pods
end

target 'Sail-iOS' do
    shared_pods
end
Run Code Online (Sandbox Code Playgroud)

Pre CocoaPods 1.0回答

你想要使用的是link_with来自你的Podfile.就像是:

link_with 'MainTarget', 'MainTargetTests'
Run Code Online (Sandbox Code Playgroud)

然后又跑pod install了.

  • 我得到了奇怪的错误 - 在测试时,`isSubclassOfClass:`调用返回`NO`,它们应返回`YES`.我可以解释这一点的唯一原因是依赖关系真正链接到main和测试目标,并且当测试目标的bundle加载器加载主bundle时,它无法决定采用哪个类. (9认同)
  • 这立即解决了我的问题. (7认同)
  • 我对`isKindOfClass:`返回`NO`时返回`NO`也有同样的问题.如果我将指针记录到我正在测试的对象的"Class"和我想要比较的类的"Class",它们是两个不同的值.很明显,我的应用程序包中的代码使用的是与我单元测试中的代码不同的类.有没有人找到解决这个问题的方法? (4认同)
  • 这应该是公认的答案,因为这是使用多个目标设置Pods的官方CocoaPods方法.很多基思! (3认同)
  • 由于其他人提到的错误,我认为这不是一个好方法.坚持根据'位更新配置文件.确保没有链接libPods.a两次. (2认同)

Mar*_*ski 174

我通过查看我的应用程序的主要目标是如何从CocoaPods库接收设置来想出这个.CocoaPods包含一个名为Pods.xcconfig的.xcconfig文件.该文件包含所有标题搜索路径.

如果您在项目导航器中查看项目并单击"信息"选项卡,您将在顶部列出您的构建配置.如果您打开不同配置的显示三角形,您将在主目标下看到Pods.我不得不点击下拉菜单并将Pods添加到逻辑测试目标中.

配置快照

我也有复制的设置$(inherited),并${PODS_HEADERS_SEARCH_PATHS}从我的主要目标和过下生成设置/ HEADER_SEARCH_PATHS将它们复制到逻辑测试目标.

最后,我必须在Link Binary中添加libPods.a,并为我的逻辑测试目标提供Libraries构建阶段.

希望这能够帮助别人.

  • 这不是解决此问题的正确方法.请参阅link_with回答.您还可以在pod文件中的per [target](http://guides.cocoapods.org/syntax/podfile.html#target)基础上指定不同的pod,即仅在测试目标中包含OCMockito. (11认同)
  • 这对我有用,谢谢.注意..我不需要将libPods.a添加到test proj和main proj中.这会导致重复的符号错误 (4认同)

Min*_*ing 53

我在这里找到了一个解决方案使用CocoaPods进行单元测试:

在Xcode中打开项目文件,然后选择Project(而不是目标),在右侧面板中,有一个名为Configurations的部分.在测试目标的"基于配置文件"列中选择"窗格".

在此输入图像描述


JRV*_*JRV 18

我同意其他答案,说明有必要将库链接到测试目标.但是到目前为止,没有任何建议对我有帮助.正如@fabb在评论中写道:"在测试时,isSubclassOfClass:调用返回NO,它们应该返回YES.我可以解释这个的唯一原因是依赖关系确实链接到main和测试目标,以及测试目标的bundle loader加载主包,它无法决定采用哪个类." 我在此主题中遇到了所有先前建议的相同问题.

我开始工作的解决方案是更新我的Podfile以为我的主目标和我的测试目标定义特定的Pod:

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

target 'MyTargetTests' do
   pod 'OCMockito', '~> 1.3.1'
end
Run Code Online (Sandbox Code Playgroud)

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

这个链接帮助我得出了这个结论.


Hai*_*Kao 6

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

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

link_with 'myProject', 'myProjectTests'
Run Code Online (Sandbox Code Playgroud)

当我将应用程序测试目标更改为逻辑单元测试目标时,会发生链接器错误.删除后:exclusive => true,一切都恢复正常.

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

link_with 'myProject', 'myProjectTests'
Run Code Online (Sandbox Code Playgroud)

:exclusive => true声明外部的所有内容do...end都不应该链接到myProjectTests,这在应用程序测试目标中是合理的,但它会导致逻辑测试目标中的链接器错误.


小智 6

您可以根据@Keith Smiley解决方案使用link_with.

如果您有常用的pod和每个目标的详细信息,您可能需要使用"def"选项来定义pod组.并在后来的独家目标中使用"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
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我将'SSKeychain'添加到两个目标,并将'Typhoon'添加到'MyProject'目标


Qw4*_*4z1 5

我对这个问题的解决方案是改变我的Podfile以在这两个目标中包含库

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

target "MyAppTests" do
    pod 'GRMustache', '~> 7.0.2'
end
Run Code Online (Sandbox Code Playgroud)

由于我使用swift,我还必须配置测试目标以包含该MyApp-Bridging-Header.h文件.(在Build Settings选项卡下的Swift Compiler组中)

  • 小心 - 这会增加你的制作时间,因为你不断添加更多的豆荚! (3认同)
  • 好吧,每次提到一个pod都是你的'Pods`项目的目标.通过提及您的pod两次(一次用于测试,一次用于应用程序),您将拥有两组目标.这有效地使"pod install"必须完成的配置工作加倍.这不会是一个问题,直到你有15个以上的豆荚,所以在此之前不要太担心. (2认同)