将Swift文件添加到测试目标不会修复单元测试问题

22

我看了很多博客并尝试了很多方法,以使得我的Swift单元测试能在Xcode 6.0.1(或6.1)中正常工作。我试图访问应用程序目标中的类,所以我编写了这行代码:

var vc: LoginViewController!

当然,我遇到了“使用未声明类型'LoginViewController'”的错误。

然后,我尝试将LoginViewController添加到我的测试目标中,但是这样做会导致我的项目中其他类出现“未解决的标识符”错误。因此,我尝试将这些类添加到我的测试目标中,但最终出现了无休止的错误,就像下面的截屏一样:

xcode swift errors

将所有类都声明为public会导致其他错误,并且似乎是不好的实践。有没有办法在依赖于许多框架和类的Swift项目中包含单元测试?我只想从这篇文章中几乎完全相同的代码开始。


1
请仔细检查目标成员资格。如果已经完成,请尝试清理项目,删除派生数据并重新启动XCode。 - Anthony Kong
到目前为止还没有生效,我现在在单元测试中遇到的主要问题是使用第三方静态框架。将类添加到测试目标中,然后调用该框架中的函数会导致“未解析的标识符'className'”的出现。 - tfrank377
请检查您的桥接头类/目录是否在应用程序目标和应用程序测试目标中都列出。 - khanh.tran.vinh
3个回答

39

经过长时间的头痛和将问题放在后台,我发现主要问题是将文件添加到测试目标成员时,Objective-C类仍会出现错误。我想这可能是 Swift 新的单元测试方式与旧版本的兼容性问题,但解决方案是 我的测试目标不知道有一个桥接头文件。因此,我在我的测试目标的构建设置中添加了它的引用,如下所示:

test target bridging header

现在看起来似乎简单明了,但当时的错误提示并没有帮助。我在针对 Swift 单元测试的其他解决方案中没有看到任何提到此问题的建议,但现在我知道了。

简而言之

为了使 Swift 中的单元测试正常工作,测试目标必须知道应用程序目标的一切信息,因此也要在测试目标中添加引用桥接头文件(如果适用)。


我花了太多时间试图理解为什么我的测试不起作用。谢谢! - diogocarmo
1
您可能需要在测试目标的构建设置下将过滤器从“基本”更改为“全部”,以便使其显示出来。 - Andrew

14
如果您正在使用Xcode 7,则现在有一种更好的方法来处理这个问题,使用@testable import {ModuleName}即可。
只需确保要测试的模块具有设置为YES的生成设置Enable Testability即可。

13

我正在使用 Xcode 6.1

您需要将您的 Swift 文件添加到测试目标的 目标成员资格

输入图片描述


我真的需要它在Xcode 6.0上工作,以进行自动化构建,但我尝试在Xcode 6.1中运行它时,出现了“使用未解决的标识符'className'”错误。 - tfrank377
8
一定有更好的方法来做这件事。将代码添加到测试目标会大大减慢测试速度。在Objective-C中,你不需要将源代码添加到测试目标中。 - Julio Bailon
这也会导致符号解析问题。由于该类在二进制文件中被包含两次,使用 as 的代码可能会解析错误。 - Greg

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