首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速测试错误“建筑x86_64的未定义符号”

快速测试错误“建筑x86_64的未定义符号”
EN

Stack Overflow用户
提问于 2016-12-25 14:42:24
回答 9查看 11.3K关注 0票数 47

我从命令行运行swift test来运行测试用例。这是测试用例:

代码语言:javascript
复制
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")
    }
}

这是输出消息。

如果我删除了KeyMapping的用法,那么一切都很好:

代码语言:javascript
复制
    func testExample() {
        // let keyMapping = KeyMapping()
        XCTAssertNotNil(true , "PASS")
    }

当我尝试使用一个类时,看起来有一个问题。如何解决这个问题?

(当我从swift package init__开始时,我没有为这个项目使用Xcode,这个项目的源代码在这里:https://github.com/trungdq88/vnk-swift)

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2017-01-01 10:36:41

通过执行以下修改,我成功地构建和测试了您的包:

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

最后:

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

为什么不能针对可执行文件进行单元测试目标链接?

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

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

票数 56
EN

Stack Overflow用户

发布于 2017-01-31 11:53:30

这似乎是导致我在模块目录中有一个main.swift的原因。这将导致生成可执行文件,而不是可以链接测试用例的库。

我通过将代码分成两个模块来解决这个问题。一个只包含main.swift的测试用例和应用程序的库。

代码语言:javascript
复制
Package.swift
Sources\FooBarLib\
Sources\FooBarLib\Something.swift
Sources\FooBarLib\MoreStuff.swift
Sources\FooBarApp\main.swift
Tests\FooBarLibTests\TestSomething.swift

然后在我的Package.swift中确保FooBarApp依赖于FooBarLib

代码语言:javascript
复制
import PackageDescription

let package = Package(
    name: "FooBar",
    targets: [
        .target(name: "FooBarLib"),
        .target(name: "FooBarApp", dependencies: ["FooBarLib"])
    ],
)

然后在TestSomething.swift中导入FooBarLib模块:

代码语言:javascript
复制
@testable import FooBarLib
import XCTest

class TestSomething: XCTestCase {
    func testFunc() {
    }
}
票数 31
EN

Stack Overflow用户

发布于 2018-02-13 08:57:36

在Swift 4中,检查您的.testTarget是否依赖于FooBarLib

代码语言:javascript
复制
    .testTarget(
        name: "FooBarLibTests",
        dependencies: ["FooBarLib"]),
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41322034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档