单元测试找不到要测试的类

Posted

技术标签:

【中文标题】单元测试找不到要测试的类【英文标题】:Unit test can't find class to test 【发布时间】:2014-06-13 19:33:58 【问题描述】:

我有一个标准类调用 GeoRssParserDelegate 需要测试。

在我的快速单元测试中,我得到了这个:

func testParser()

    var bundle = NSBundle(forClass:GeoRssParserTest.classForKeyedArchiver())
    var path = bundle.pathForResource("test", ofType: "xml")
    let data = NSData.dataWithContentsOfFile(path, options: NSDataReadingOptions.DataReadingMapped, error: nil)
    let xmlParser = NSXMLParser(data:data)
    let delegate = GeoRssParserDelegate() <-- Compiler fails here
    var bStatus = xmlParser.parse()
    XCTAssertTrue(bStatus, "Parse failed", file: __FILE__, line: __LINE__)        

编译器在上面突出显示的行上失败。编译器错误是 Use of unresolved identifier GeorRssParserDelegate

这个类确实存在并且与产品本身一起构建。有什么特殊要求吗?

【问题讨论】:

也许是个愚蠢的问题:但是你确定它是一个类而不是一个协议吗?无论哪种方式,您都可能需要发布更多代码。 【参考方案1】:

您必须将应用程序的模块导入到您的单元测试中。这通常是您的应用名称。例如,如果您的应用名称是 GeoRssParser,则 import 语句将是:

import GeoRssParser

【讨论】:

我想给这个答案 1000 票。谢谢。 不确定是否总是这样,但这仅适用于我在导入语句前加上 @testable【参考方案2】:

适用于我的 Xcode 8 和 UP 解决方案:

@testable import Product_Module_Name

注意:不是目标名称而是产品名称。

关于上面的答案:没有@testable 将需要公开类和方法,这会改变应用程序架构的设计。如果您不想更好地使用此解决方案进行更改,则无需更改类是否公开。

非常感谢answer

【讨论】:

【参考方案3】:

如果您正在测试的类被编译到另一个目标中(例如您的应用程序,而不是测试包),请确保您尝试使用的类或结构标记为 public -默认访问可见性不允许跨目标测试。

【讨论】:

恕我直言,除了詹姆斯的答案之外,这应该是正确的答案。将测试的 Class 或 struct 标记为 public 是必要的。否则测试目标将找不到它。并且肯定它必须被导入...... 在 Xcode 6.3 beta 3 中,我不仅必须将每个要测试的类标记为公共,而且还必须将每个组成类或实例函数标记为测试。很麻烦。 这不再是这种情况,因为您可以在 Swift 2.0 中使用 @testable【参考方案4】:

如果您使用的是全新的 XCode 7(截至 2015 年 7 月 21 日),只需编写: @testable import GeoRssParserDelegate

来源:http://natashatherobot.com/swift-2-xcode-7-unit-testing-access/

【讨论】:

这对任何人都有效吗?对我来说,它在 Xcode 8 中出现错误:No such module 'class_name'【参考方案5】:
@testable import MyApp

重要!注意: MyApp 必须是你项目中的产品模块名称(Settings -> Target -> Build Setting -> Product Module Name)

【讨论】:

【参考方案6】:

只需将您正在测试的类添加到 Target -> Build Phases -> Compile Sources

这就是我解决问题的方法。

【讨论】:

此解决方案运行良好,但将应用目标的类包含到测试目标的应用并不是一个好的设计 @testable import 是要走的路,向测试目标添加文件是我们过去在 Objective-C 中的做法,但不是很快。【参考方案7】:

执行以下 3 个步骤 --> 1. 编写@testable import Your_Project_name 2.然后保存(CTRL+S) 3.然后构建(CTRL+B)

【讨论】:

【参考方案8】:

对我来说,我想测试的引用或值类型未标记为public。这就是为什么我只是将关联类型用作复制粘贴。

【讨论】:

以上是关于单元测试找不到要测试的类的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Xcode 找不到我的单元测试应用程序?

错误:找不到满足单元测试要求的版本(来自版本:无)错误:未找到单元测试的匹配分布

竹 xcode 单元测试 - 找不到工作区

Intellij Android + Maven 找不到单元测试

Python单元测试找不到模块[重复]

iPhone单元测试链接问题,找不到DevToolsBundleInjection.framework