iOS - 运行Swift的单元测试时找不到'MyProject-Swift.h'文件

Jim*_*med 91 unit-testing header ios swift

我正在尝试为我的项目设置单元测试.它是一个现有的Objective-C应用程序,我最近添加了一个Swift类.我已经设置了'MyProject-Swift.h'和Swift Bridging文件('MyProject'和'MyProjectTest'),我能够使用Objective-C和Swift代码构建和运行应用程序.

但是,现在我想在新的Swift类上运行一些单元测试.我设置了我的测试文件,它看起来如下:

MySwiftClassTests.swift:

import UIKit
import XCTest
import MyProject

class MySwiftClassTests: XCTestCase {

    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }

    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    func testExample() {
        // This is an example of a functional test case.
        XCTAssert(true, "Pass")
    }

    func testPerformanceExample() {
        // This is an example of a performance test case.
        self.measureBlock() {
            // Put the code you want to measure the time of here.
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

运行应用程序作为测试时出现此错误:

'MyProject-Swift.h' file not found
Run Code Online (Sandbox Code Playgroud)

我不确定为什么只有在尝试运行测试时才会发生这种情况.有什么建议?

gag*_*wal 143

"MyProject-Swift.h"文件在以下路径生成:

"$(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources"

我最终将此添加到我的单元测试目标的标题搜索路径.

另外,正如@hyouuu所指出的那样,已知问题是苹果公司将在他们的最后提供一些好的解决方案.直到我相信我们需要使用上述解决方案.

https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html

  • 仅在PROJECT_NAME等于TARGET_NAME时才有效. (4认同)
  • 只需注意,我必须添加搜索路径,并将其设置为"递归".可能是显而易见的,但在我这样做之前它没有工作几次; 我假设它进入子文件夹然后. (2认同)
  • 我目前遇到这个问题,而且似乎还无法解决。我已经尝试了该线程上的所有内容,但仍然遇到问题 - 运行所有最新版本。 (2认同)

Chr*_*lay 30

感谢@gagarwal解决这个问题.在我们的例子中,产品名称有一个空格,它被折叠$PROJECT_NAME,所以我不得不硬编码.此外,通过使用$CONFIGURATION_TEMP_DIR而不是$TARGET_TEMP_DIR,您可以../从路径中删除父目录().因此,解决方案是将以下内容添加到测试目标中的标头搜索路径:

"$(CONFIGURATION_TEMP_DIR)/Product Name With Spaces.build/DerivedSources"
Run Code Online (Sandbox Code Playgroud)

或者,如果您的产品不包含空格:

"$(CONFIGURATION_TEMP_DIR)/$(PROJECT_NAME).build/DerivedSources"
Run Code Online (Sandbox Code Playgroud)


hyo*_*uuu 14

在Xcode 6.1发行说明中看到,这是一个已知问题...签名...在发行说明中搜索"-swift.h" https://developer.apple.com/library/mac/releasenotes/DeveloperTools /RN-Xcode/Chapters/xc6_release_notes.html

用Objective-C编写的测试无法为应用程序目标导入Swift生成的接口头($(PRODUCT_MODULE_NAME)-Swift.h),因此无法用于测试需要此头的代码.

Swift代码的测试应该用Swift编写.用Objective-C编写的框架目标测试可以通过使用@import FrameworkName;导入框架模块来访问Swift生成的接口.(16931027)

请参阅以下@ gagarwal的解决方法,其中包含哪些工作!


dpa*_*age 8

我觉得我和你的问题有类似的问题; 这是我的设置.

我在Swift中定义了一个对象:

// file Foo.swift
@objc public class Foo {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后在Objective-C对象的初始化程序中使用该类:

// file Bar.h
#import "MyProject-Swift.h"

@interface Bar: NSObject

- (instancetype)initWithFoo:(Foo *)foo;

@end
Run Code Online (Sandbox Code Playgroud)

这使我的单元测试Bar不能编译,因为MyProject-Swift.h标头不是真实的并且单元测试目标无法看到它.@hyouuu共享的发行说明非常重要 - 但我没有测试Swift类,我正在测试Objective-C类!

我能够通过更改头文件Bar以使用转发类引用来解决此问题:

// file Bar.h
@class Foo;

@interface Bar: NSObject

- (instancetype)initWithFoo:(Foo *)foo;

@end
Run Code Online (Sandbox Code Playgroud)

然后我加入MyProject-Swift.hBar.m,一切正常 - 我用Objective-C编写的Objective-C对象的测试正确编译并继续运行,我可以在Swift中为Swift对象编写新的测试.

希望这可以帮助!

  • 确实如此 - 这就是包含`.m`文件中的`MyProject-Swift.h`的内容. (2认同)