单元测试iOS应用扩展

Mic*_*ala 8 xcode unit-testing ios cocoapods swift

我的iOS应用有多个扩展程序:

  • 今天延期

  • siri扩展

  • imessage扩展

我还创建了共享公共代码的框架.我的问题是我想要一个单元测试目标,它将测试所有扩展.我的Podfile看起来像这样:

 target 'MyApp' do
   pod 'MyFramework', :path => './MyFramework'
     target 'MyAppTests' do
       inherit! :search_paths
     end
 end

abstract_target 'Extensions' do
  pod 'MyFramework', :path => './MyFramework'
  target 'TodayExtension'
  target 'SiriExtension'
  target 'iMessageExtension'
  target 'ExtensionsTests'
end
Run Code Online (Sandbox Code Playgroud)

如您所见,我创建了ExtensionsTests目标,但我不知道如何继承所有扩展的搜索路径.我也尝试使用 @testable import TodayExtension但是我得到了架构x86_64的未定义符号的链接错误.

我有什么想法可以解决这个问题?

完整的错误代码:

Undefined symbols for architecture x86_64:
  "type metadata accessor for TodayExtension.LoadingView", referenced from:
      ExtensionTests.LoadingViewTests.setUp () -> () in LoadingViewTests.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

编辑:

我认为这个问题很普遍:我如何测试任何扩展代码?我创建了单个视图项目,今天添加了扩展,我无法扩展代码.

在apple docs中只有这些信息:

要使用Xcode测试框架(即XCTest API)测试应用程序扩展,请编写使用包含应用程序作为主机环境来执行扩展代码的测试.要了解有关测试的更多信息,请参阅使用Xcode进行测试

这不是很有帮助

sha*_*ght 1

x86_64 体系结构的未定义符号

该错误告诉您TodayExtension无法找到(或部分) 的architecture x86_64. 架构 x86_64 是您的模拟器架构。

我怀疑您将TodayExtension目标设置为真实设备(架构arm x)并将TodayExtension构建设置Build Active Architecture Only设置为YES,这意味着它是为您的目标设备架构(arm x)而不是模拟器(x86_64)构建的。

使固定

TodayExtension构建设置中(及其所有依赖项,如果有的话):

  • 设置Build Active Architecture OnlyNO

  • 设置Valid Architecturesarm64, armv7, armv7s, i386, x86_64(如果尚未设置

重建TodayExtension

如果问题仍然存在,请仔细检查工件切片。在终端中:

file /path/to/TodayExtension.apex/TodayExtension
Run Code Online (Sandbox Code Playgroud)

它应该输出:

/path/to/TodayExtension.appex/TodayExtension: Mach-O 64-bit executable x86_64
Run Code Online (Sandbox Code Playgroud)

对于你的框架:

file /path/to/MyFramework.framework/MyFramework
Run Code Online (Sandbox Code Playgroud)

应该输出:

path/to//MyFramework.framework/MyFramework: Mach-O universal binary with 5 architectures
path/to//MyFramework.framework/MyFramework (for architecture x86_64):   Mach-O 64-bit dynamically linked shared library x86_64
path/to//MyFramework.framework/MyFramework (for architecture i386): Mach-O dynamically linked shared library i386
path/to//MyFramework.framework/MyFramework (for architecture armv7):    Mach-O dynamically linked shared library arm
path/to//MyFramework.framework/MyFramework (for architecture armv7s):   Mach-O dynamically linked shared library arm
path/to//MyFramework.framework/MyFramework (for architecture arm64):    Mach-O 64-bit dynamically linked shared library
Run Code Online (Sandbox Code Playgroud)