单元测试找不到要测试的类
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
。这就是为什么我只是将关联类型用作复制粘贴。
【讨论】:
以上是关于单元测试找不到要测试的类的主要内容,如果未能解决你的问题,请参考以下文章
错误:找不到满足单元测试要求的版本(来自版本:无)错误:未找到单元测试的匹配分布