我从命令行运行swift test来运行测试用例.以下是测试用例:

import XCTest
@testable import vnk_swift

class KeyMappingTests: XCTestCase {
    static var allTests : [(String, (KeyMappingTests) -> () throws -> Void)] {
        return [
            // ("testExample", testExample),
        ]
    }

    func testExample() {
        let keyMapping = KeyMapping()
        XCTAssertNotNil(keyMapping , "PASS")
    }
}

这是输出信息.

image

如果我go 掉KeyMapping的用法,一切正常:

    func testExample() {
        // let keyMapping = KeyMapping()
        XCTAssertNotNil(true , "PASS")
    }

image

看起来当我try 使用一个类时出现了问题.How do I fix this?

(I did not use Xcode for this project as I started with 101, the source code for this project is here: 100)

推荐答案

我通过以下修改成功构建并测试了您的软件包:

  • 将包名重命名为VnkSwift,由于某些原因,生成工具不喜欢包名中的破折号,当生成的包名中有下划线时,它也不起作用(因此将包重命名为vnk_swift以确保导入语句和包名匹配不起作用)
  • 将测试文件夹重命名为VnkSwiftTests,以便链接器知道要链接什么;似乎这是链接器知道如何链接包的先决条件
  • 最后,将main.swift改名为其他名称(我使用了utils.swift).问题是,main.swift的存在指示构建工具生成一个可执行文件,而针对一个可执行文件的链接并不能很好地工作.重命名后,必须对if代码进行注释,因为全局运行代码只能属于main.swift.

总结如下:

  • 避免使用非字母数字的包名
  • 包名和测试目录名必须同步
  • 确保你没有一个main.swift文件,以确保包可以链接到

Why can't a unit test target link against executables?

这是因为测试包和可执行包都有全局执行代码(也就是主函数),所以链接器不知道 Select 哪一个.当从Xcode进行测试时,测试包会运行到应用程序的上下文中——它不会与之链接,就像这里的情况一样.

Xcode在创建命令行工具时也有这个问题——不能对该目标进行单元测试,如果要对代码进行单元测试,则必须创建一个库,该库将由该工具和单元测试目标链接(或将文件包含在两个目标中)

Swift相关问答推荐

如何避免使用DispatchSemaphores时线程爆炸?

如何返回JSON数据?

从后台线程获取@发布属性的值(不更改它)是正确的吗?

在SWIFT中使用Objective-C struct 时出错(在作用域中找不到类型)

是否在核心数据中使用Uint?

更改 SwiftUI 中按钮矩阵的填充 colored颜色

Xcode创建GitHub仓库,但未推送所有文件

If 语句在 Swift 中有 2 个日期

SwiftUI View .tint(_ Color) 方法不起作用

在 SwiftUI 中操作绑定变量

将阻塞函数集成到 Swift 异步中

macOS 守护进程应该由Command Line ToolXcode 模板制作吗?

当我必须在 Swift 中的类、 struct 和枚举之间进行 Select 时,我应该如何推理?

Swift 2 或 3 中的 Google Analytics 问题

iOS Swift - 如何更改表格视图的背景 colored颜色 ?

在 Swift 框架中加载资源(例如故事板)

在 Swift for iOS 中沿圆形路径绘制文本

Swift:创建 UIImage 数组

<<错误类型>> 奇怪的错误

应用程序包不包含有效标识符