在运行Swift的unit testing时找不到“MyProject-Swift.h”文件

我正在尝试为我的项目设置unit testing。 这是一个现有的Objective-C应用程序,我最近添加了一个Swift类。 我已经安装了“MyProject-Swift.h”和Swift Bridging文件(包括“MyProject”和“MyProjectTest”),并且能够使用Objective-C和Swift代码很好地构build和运行应用程序。

不过,现在我想在新的Swift类上运行一些unit testing。 我设置我的testing文件,它看起来像下面这样:

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. } } } 

testing时运行应用程序时出现此错误:

 'MyProject-Swift.h' file not found 

我不知道为什么只有在试图运行testing时才会发生这种情况。 有什么build议么?

在以下path中生成“MyProject-Swift.h”文件:

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

我最终将其添加到我的unit testing目标的标题searchpath。

另外@hyouuu指出了这个已知的问题,希望苹果能够提供一些很好的解决scheme。 直到我相信我们需要使用这个以上的解决scheme。

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

感谢@gagarwal找出这个问题。 在我们的例子中,产品名称有一个空间,在$PROJECT_NAME折叠,所以我必须对它进行硬编码。 此外,通过使用$CONFIGURATION_TEMP_DIR而不是$TARGET_TEMP_DIR ,可以从path中删除父目录( ../ )。 因此,解决scheme是将以下内容添加到testing目标中的标题searchpath中:

 "$(CONFIGURATION_TEMP_DIR)/Product Name With Spaces.build/DerivedSources" 

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

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

在Xcode 6.1发行说明中看到,这是一个已知问题… sign …在发行说明中search“-swift.h” https://developer.apple.com/library/mac/releasenotes/DeveloperTools /RN-Xcode/Chapters/xc6_release_notes.html

用Objective-C编写的testing不能导入用于应用程序目标的Swift生成的接口头文件($(PRODUCT_MODULE_NAME)-Swift.h),因此不能用于testing需要这个头文件的代码。

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

请参阅下面的@ gagarwal的解决方法工作!

我想,我的问题和你们的问题相似。 这是我的设置。

我有一个在Swift中定义的对象:

 // file Foo.swift @objc public class Foo { // ... } 

这个类然后被用在Objective-C对象的初始化器中:

 // file Bar.h #import "MyProject-Swift.h" @interface Bar: NSObject - (instancetype)initWithFoo:(Foo *)foo; @end 

这使得我的unit testingBar不能编译,因为MyProject-Swift.h头是不真实的,unit testing目标不能看到它。 @hyouuu共享的发行说明是重点 – 但我没有testing一个Swift类,我正在testing一个Objective-C类!

我能够通过更改Bar的头文件来解决这个问题,以便使用前向类引用:

 // file Bar.h @class Foo; @interface Bar: NSObject - (instancetype)initWithFoo:(Foo *)foo; @end 

然后,我在Bar.m包含了MyProject-Swift.h ,并且一切正常 – 我用Objective-C编写的Objective-C对象的testing正确编译并继续运行,我可以在Swift中为Swift对象编写新的testing。

希望这可以帮助!

我不能通过添加其他答案提到的filepath来实现它,但是我意识到这个文件在哪里抱怨甚至没有被testing。 我只需要使用右侧的工具栏来从testing目标中删除它。

向该目标添加一个.swift文件修复了这个问题。

奇怪的是,我看到了这个相同的错误,但只有当瞄准一个设备(而不是模拟器)。 在运行testing之前,我会在“MyProjectNameTests-Swift.h”的导入语句旁边看到红色感叹号。

然而,有趣的是,如果我只是继续运行testing(尽pipe存在这种明显的构build错误),那么在之后发生的构build阶段,XCode实际上会生成“MyProjectNameTests-Swift.h”文件,testing运行得很好!

所以,至less在我的情况下,这里没有其他解决scheme的需要,显然,虽然我相信他们也有效。

我也应该注意到,在此之前我删除了我的DerivedData目录,所以也许这是一个值得尝试的步骤。

在我尝试了所有可以find的主题之后, 对我来说工作的东西 实际上是在运行应用程序,尽pipe它仍然显示'ModuleName-Swift.h file not found'错误。

它消失了,我的应用程序工作得很好。 我想我应该考虑早些时候… 错误不断回来 ,但运行应用程序后,它总是会消失。 所以这个问题并没有真正解决,但我现在可以继续研究其他话题了。

mySwiftClassTests (以及其他想在Objective-C中使用的swift类)需要标记@objc

 @objc class MySwiftClassTests: XCTestCase