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所指出的那样,已知问题是苹果公司将在他们的最后提供一些好的解决方案.直到我相信我们需要使用上述解决方案.
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的解决方法,其中包含哪些工作!
我觉得我和你的问题有类似的问题; 这是我的设置.
我在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.h了Bar.m,一切正常 - 我用Objective-C编写的Objective-C对象的测试正确编译并继续运行,我可以在Swift中为Swift对象编写新的测试.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
19855 次 |
| 最近记录: |