iOS应用程序扩展单元测试

10
我的iOS应用有多个扩展:
  • today扩展
  • 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

你看到我创建了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)

编辑:

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

在苹果文档中只有这些信息:

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

这并不是很有帮助。


在 TodayExtensions 的构建设置中,将 Build Active Architecture Only 设置为 NO - shallowThought
@shallowThought 这些设置出现了相同的错误。 - MichalMoskala
在设置“仅构建活动架构”后,您是否成功构建了TodayExtension? - shallowThought
抱歉 @shallowThought,我再次检查后发现在将“Build Active Architecture”设置为NO后无法构建此目标。有任何想法原因是什么? - MichalMoskala
添加了更多信息的答案。 - shallowThought
这个答案对我有用。 - rgkobashi
3个回答

2

我遇到了同样的问题。根据 这个答案,以这种方式单元测试扩展是不支持的。作为一种解决方法,你可以将你想要测试的代码拆分成一个框架,并在你的扩展目标和扩展测试目标中都包含它。


2
苹果文档中的引用是完全正确的。
要使用Xcode测试框架(即XCTest API)测试应用程序扩展,请编写测试,使用您的包含应用程序作为主机环境来运行扩展代码。有关测试的更多信息,请参见《使用Xcode进行测试》。
你可能会陷入一个陷阱,我经常陷入其中:单元测试应该测试“单元”的功能。不要测试“单元”中的每个小助手函数,而是测试公共函数。同样适用于框架。仅为公共功能编写测试。如果您测试得更多,则花费在编写测试上的时间太多了。
您可以创建一个单元测试目标,并将主应用程序选择为“要测试的目标”。然后在测试文件中,只需像主机应用程序一样加载扩展并测试主机应用程序使用的交互是否正确返回即可。

6
“像宿主应用程序一样加载扩展”是什么意思? - patric.schenke

1
错误提示你在x86_64架构下找不到TodayExtension(或其一部分)。x86_64架构是您模拟器的架构。我怀疑你使用实际设备(arm x架构)设置了TodayExtension的目标,并且TodayExtension的构建设置“仅构建活动架构”设置为“是”,这意味着它构建为目标设备的架构(arm x),而不是模拟器(x86_64)。解决方法:在TodayExtension的构建设置中(以及所有依赖项中,如果有):将“仅构建活动架构”设置为“否”,将“有效架构”设置为“arm64、armv7、armv7s、i386、x86_64”(如果尚未设置)。重新构建TodayExtension。
如果问题仍然存在,请仔细检查工件切片。在终端中输入:
file /path/to/TodayExtension.apex/TodayExtension

它应该输出:
/path/to/TodayExtension.appex/TodayExtension: Mach-O 64-bit executable x86_64

而对于您的框架:

file /path/to/MyFramework.framework/MyFramework

应该输出:
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

我需要将“仅构建活动架构”设置为TodayExtension的所有依赖项,才能使其正常工作。但是,当我尝试测试ExtensionTests目标时,仍然会出现错误。我认为问题与其他事情有关。 - MichalMoskala
请将完整的错误信息“undefined symbols for architecture x86_64”的链接错误添加到问题中。 - shallowThought
你的测试目标是UITest目标吗?type metadata accessor很可疑。 - shallowThought

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接