163

我只是想从另一个文件中包含我的 Swift 类,比如它的测试

PrimeNumberModel.swift

import Foundation

class PrimeNumberModel { }

PrimeNumberModelTests.swift

import XCTest
import PrimeNumberModel  // gives me "No such module 'PrimeNumberModel'"

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()  // "Use of unresolved identifier 'PrimeNumberModel'"    
}

两个 swift 文件都在同一个目录中。

4

13 回答 13

134

我的XCTestCase文件中也有同样的问题,但在常规项目文件中没有。

摆脱:

使用未解析的标识符“PrimeNumberModel”

我需要import测试文件中的基本模块。就我而言,我的目标被称为“myproject”,我添加import myproject了该类并且该类被识别。

于 2014-06-04T18:56:28.223 回答
72

更新 Swift 2.x、3.x、4.x 和 5.x

现在您不需要添加public到方法中进行测试。在较新版本的 Swift 上,只需要添加@testable关键字。

PrimeNumberModelTests.swift

import XCTest
@testable import MyProject

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()
}

而你的内部方法可以保持Internal

PrimeNumberModel.swift

import Foundation

class PrimeNumberModel {
   init() {
   }
}

请注意,即使使用private( 和fileprivate) 符号也不可用@testable


斯威夫特 1.x

这里有两个来自 Swift 的相关概念(作为 Xcode 6 beta 6)。

  1. 您不需要导入 Swift 类,但需要导入外部模块(目标)
  2. Swift 中的默认访问控制级别是Internal access

考虑到测试在另一个目标上,PrimeNumberModelTests.swift您需要import包含要测试的类的目标,如果您的目标被调用,MyProject则需要添加import MyProjectPrimeNumberModelTests

PrimeNumberModelTests.swift

import XCTest
import MyProject

class PrimeNumberModelTests: XCTestCase {
    let testObject = PrimeNumberModel()
}

但这还不足以测试你的 class PrimeNumberModel,因为默认的访问控制级别是Internal Access,你的 class 对测试包不可见,所以你需要让它Public Access和你想要测试的所有方法:

PrimeNumberModel.swift

import Foundation

public class PrimeNumberModel {
   public init() {
   }
}
于 2014-08-25T01:26:45.350 回答
51

文档中它说 Swift 中没有导入语句。

在此处输入图像描述

只需使用:

let primNumber = PrimeNumberModel()
于 2014-06-04T05:50:59.113 回答
35

在您的测试目标中检查 PrimeNumberModel.swift 的目标成员资格。

于 2014-06-09T05:58:31.983 回答
19

在 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()
}

如您所见,不需要导入。希望这可以帮助。

于 2014-07-18T20:08:22.850 回答
6

我能够通过清理我的构建来解决这个问题。

顶部菜单 -> 产品 -> 清理或键盘快捷键:Shift+ Cmd+K

于 2015-01-22T20:52:20.057 回答
6

根据 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 解决方案将起作用

于 2014-06-04T22:39:39.327 回答
5

从 Swift 2.0 开始,最佳实践是:

将这一行添加@testable import MyApp到测试文件的顶部,其中“MyApp”是应用目标的产品模块名称(可在应用目标的构建设置中查看)。而已。

(请注意,产品模块名称将与您的应用程序目标的名称相同,除非您的应用程序目标的名称包含空格,这将替换为下划线。例如,如果我的应用程序目标名为“Fun Game”,我会@testable import Fun_Game在我的测试的顶部。)

于 2016-01-05T05:51:17.900 回答
3

检查您的PrimeNumberModelTests目标设置。

如果PrimeNumberModel.swift在 Build 中看不到文件Phases/Compile Sources,请添加它。

于 2014-07-03T12:42:42.770 回答
2

您需要添加一个例程供编译器引用作为入口点,因此添加一个 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

警告:为简单起见,我删除了 import XCTest 和 XCTestCase 类型。

于 2016-06-27T03:48:11.083 回答
1

所以,你需要

  1. 导入要使用的外部模块
  2. 并确保您对要使用的类和方法具有正确的访问修饰符。

在我的情况下,我有一个我想要单元测试的 swift 文件,并且单元测试文件也是一个 swift 类。我确保访问修饰符是正确的,但声明

import stMobile

(假设 stMobile 是我们的目标名称)

仍然没有工作(我仍然收到“没有这样的模块”错误),我检查了我的目标,它的名字确实是 st​​Mobile。所以,我去构建设置,在包装下,找到产品模块名称,由于某种原因,它被称为 St_Mobile,所以我改变了我的导入语句

import St_Mobile

(这是产品模块名称),一切正常。

所以,总结一下:

  1. 检查您的产品模块名称并在您的单元测试类中使用下面的导入语句

    import myProductModuleName
    
  2. 确保您的访问修饰符是正确的(类级别和您的方法)。

于 2014-10-04T11:37:35.250 回答
1

Swift 编译器不需要显式导入,而是隐式搜索.swiftmodule依赖 Swift 库的文件。

Xcode 可以为您构建 swift 模块,或参考railsware 博客获取swiftc.

于 2014-12-02T15:37:52.953 回答
1

正如@high6 和@erik-p-hansen 在@high6 给出的答案中指出的那样,这可以通过导入 PrimeNumberModel 类所在模块的目标来克服,这可能与您在简单项目中的项目名称相同.

在看这个的时候,我在 swiftcast.tv 上看到了 Clayton McIlrath写的用 Swift 编写你的第一个单元测试的文章。它讨论了访问修饰符,展示了您遇到的相同问题的示例(但对于 ViewController 而不是模型文件),并展示了如何导入目标并通过在目标中包含目标文件来解决访问修饰符问题,这意味着除非您真的想这样做,否则您不必公开您尝试测试的课程。

于 2015-01-04T20:17:31.000 回答