在运行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。
感谢@gagarwal找出这个问题。 在我们的例子中,产品名称有一个空间,在$PROJECT_NAME
折叠,所以我必须对其进行硬编码。 此外,通过使用$CONFIGURATION_TEMP_DIR
而不是$TARGET_TEMP_DIR
,可以从path中删除父目录( ../
)。 所以解决方法是将以下内容添加到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