我只是想从其他文件中包含我的Swift类,比如它的测试
PrimeNumberModel.svift
import Foundation
class PrimeNumberModel { }
PrimeNumberModelTests.svift
import XCTest
import PrimeNumberModel // gives me "No such module 'PrimeNumberModel'"
class PrimeNumberModelTests: XCTestCase {
let testObject = PrimeNumberModel() // "Use of unresolved identifier 'PrimeNumberModel'"
}
两个swift文件都在同一目录中。
我有同样的问题,也在我的XCTestCase
文件中,但不是在常规项目文件中。
摆脱:
使用未解析的标识符'PrimeNumberModel'
我需要import
测试文件中的基本模块。在我的情况下,我的目标被称为'myproject',我添加了import myproject
并且该类被识别。
检查您的PrimeNumberModelTests
目标设置。
如果你在Build PrimeNumberModel.swift
中看不到Phases/Compile Sources
文件,请添加它。
所以,你需要
在我的情况下,我有一个我想要单元测试的swift文件,单元测试文件也是一个快速的类。我确保访问修饰符是正确的,但声明
import stMobile
(假设stMobile是我们的目标名称)
仍然没有工作(我仍然得到'没有这样的模块'错误),我检查了我的目标,它的名字确实是stMobile。所以,我去打包设置,在包装下,找到了产品模块名称,由于某种原因,这被称为St_Mobile,所以我改变了我的import语句
import St_Mobile
(这是产品模块名称),一切正常。
所以,总结一下:
import myProductModuleName
Swift编译器不是要求显式导入,而是隐式搜索依赖Swift库的.swiftmodule
文件。
Xcode可以为您构建swift模块,或者参考railsware blog获取swiftc
的命令行指令。
正如@ high6和@ erik-p-hansen在@ high6给出的答案中指出的那样,可以通过导入PrimeNumberModel类所在模块的目标来克服这个问题,该模块可能与简单项目中的项目名称相同。
看着这个,我在Clayton McIlrath的swiftcast.tv上看到了文章Write your first Unit Test in Swift。它讨论了访问修饰符,显示了您遇到的相同问题的示例(但对于ViewController而不是模型文件),并显示如何通过在目标中包含目标文件来导入目标并解决访问修饰符问题,这意味着除非你真的想这样做,否则你不必让你试图公开测试的课程。
现在您不需要将public
添加到要测试的方法中。在较新版本的Swift上,只需要添加@testable
关键字。
PrimeNumberModelTests.svift
import XCTest
@testable import MyProject
class PrimeNumberModelTests: XCTestCase {
let testObject = PrimeNumberModel()
}
而你的内部方法可以保持Internal
PrimeNumberModel.svift
import Foundation
class PrimeNumberModel {
init() {
}
}
请注意,即使使用private
,fileprivate
(和@testable
)符号也不可用。
Swift有两个相关概念(如Xcode 6 beta 6)。
Internal access
考虑到测试是在PrimeNumberModelTests.swift
上的另一个目标,你需要import
包含你要测试的类的目标,如果你的目标被调用MyProject
需要将import MyProject
添加到PrimeNumberModelTests
:
PrimeNumberModelTests.svift
import XCTest
import MyProject
class PrimeNumberModelTests: XCTestCase {
let testObject = PrimeNumberModel()
}
但这还不足以测试你的类PrimeNumberModel
,因为默认的访问控制级别是Internal Access
,你的类将不会被测试包看到,所以你需要使它成为Public Access
以及你要测试的所有方法:
PrimeNumberModel.svift
import Foundation
public class PrimeNumberModel {
public init() {
}
}
检查测试目标中PrimeNumberModel.swift的目标成员身份。
在Objective-C中,如果你想在另一个文件中使用一个类,你必须导入它:
#import "SomeClass.h"
但是,在Swift中,您根本不需要导入。只需使用它就像它已经导入一样。
// This is a file named SomeClass.swift
class SomeClass : NSObject {
}
// This is a different file, named OtherClass.swift
class OtherClass : NSObject {
let object = SomeClass()
}
如您所见,不需要导入。希望这可以帮助。
根据Apple,您不需要在同一目标中导入swift文件。我终于通过将我的swift文件添加到我的常规目标和测试目标来实现它。然后我使用桥接头进行测试,以确保我在常规桥接头中引用的ObjC文件可用。现在就像魅力一样。
import XCTest
//Optionally you can import the whole Objc Module by doing #import ModuleName
class HHASettings_Tests: XCTestCase {
override func setUp() {
let x : SettingsTableViewController = SettingsTableViewController()
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.
}
}
}
因此,请确保PrimeNumberModel具有测试目标的目标。或High6导入整个模块的解决方案将起作用
我能够通过清理我的构建来解决这个问题。
顶部菜单 - >产品 - >清洁或键盘快捷键:Shift + Cmd + K.
从Swift 2.0开始,最佳做法是:
将行@testable import MyApp
添加到测试文件的顶部,其中“MyApp”是应用程序目标的产品模块名称(可在应用程序目标的构建设置中查看)。而已。
(请注意,产品模块名称将与应用目标的名称相同,除非您的应用目标名称包含空格,将替换为下划线。例如,如果我的应用目标被称为“趣味游戏”,我会写@testable import Fun_Game
at我测试的顶部。)
您需要为编译器添加一个例程作为入口点引用,因此添加一个main.swift文件,在这种情况下只创建一个测试文件的实例:
main.swift
PrimeNumberModelTests()
然后在命令行上编译(我正在使用El Capitan和Swift 2.2):
xcrun -sdk macosx swiftc -emit-executable -o PrimeNumberMain PrimeNumberModel.swift PrimeNumberModelTests.swift main.swift
在这种情况下,您将收到一条警告:初始化程序的结果未使用,但程序编译并可执行:
./PrimeNumberMain
CAVEAT:为简单起见,我删除了导入XCTest和XCTestCase类型。