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

Lee*_*Lee 25 swift

我有一个库存标准类调用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__)        
}
Run Code Online (Sandbox Code Playgroud)

编译器在上面突出显示的行上失败.编译器错误是使用未解析的标识符GeorRssParserDelegate

该类确实存在并且与产品本身一起构建.有什么需要特别的吗?

Jam*_*ard 53

您必须将应用程序的模块导入到单元测试中.这通常是您的应用名称.例如,如果你的应用程序名称是GeoRssParserimport声明将是:

import GeoRssParser
Run Code Online (Sandbox Code Playgroud)

  • 不确定它是否总是这样,但是当我使用`@ testable`作为前缀时,这只对我有用. (7认同)

Tun*_*Fam 22

适用于我的Xcode 8/9解决方案:

@testable import Product_Module_Name
Run Code Online (Sandbox Code Playgroud)

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

关于上述答案:无需制作@testable将需要公开改变应用程序架构设计的类和方法.如果您不想更好地更改它以使用此解决方案,那么您将不需要对类公开或不更改.

非常感谢这个答案


Sop*_*ert 19

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

  • 这不再是这种情况,因为你可以在Swift 2.0中使用@testable (3认同)

Luk*_*ski 13

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

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


ate*_*kov 6

@testable import MyApp
Run Code Online (Sandbox Code Playgroud)

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