为什么我不能使用 Xcode 测试基本的多平台应用程序?
Why can't I test a basic Multiplatform app with Xcode?
我用 Xcode 创建了一个名为 Tester 的新多平台应用程序,然后添加了一个超级简单的 class:
class Transaction {
var time = "1"
}
在 Tests_iOS 我有这个:
import XCTest
@testable import Tester
class Tests_iOS: XCTestCase {
func testExample() throws {
let t = Transaction()
XCTAssertEqual(t.time, "1")
}
}
应用程序编译,但是当我尝试 运行 测试时,编译失败并出现此错误:
Undefined symbols for architecture arm64:
"type metadata accessor for Tester.Transaction", referenced from:
Tests_iOS.Tests_iOS.testExample() throws -> () in Tests_iOS.o
"Tester.Transaction.__allocating_init() -> Tester.Transaction", referenced from:
Tests_iOS.Tests_iOS.testExample() throws -> () in Tests_iOS.o
ld: symbol(s) not found for architecture arm64
我做错了什么?这是在 M1 Mac 上使用 Xcode 13.3
问题很可能是您已将测试添加到创建新 multi-platform 项目时自动创建的测试目标,并且该目标是 UI 测试目标而不是普通单元测试目标。
对于这些测试,您不像交易 class 那样访问应用程序的 public api,而是访问 UI 组件,因此测试框架无法访问交易 class.
解决方案是创建一个新的单元测试目标,文件 -> 新建 -> 目标...和 select 单元测试(记住 select 正确的平台,因为这需要为每个支持的平台单独完成)。
完成后,将您的测试移动到新目标或将其复制到生成的测试文件中,您的测试将构建并且 运行。
我用 Xcode 创建了一个名为 Tester 的新多平台应用程序,然后添加了一个超级简单的 class:
class Transaction {
var time = "1"
}
在 Tests_iOS 我有这个:
import XCTest
@testable import Tester
class Tests_iOS: XCTestCase {
func testExample() throws {
let t = Transaction()
XCTAssertEqual(t.time, "1")
}
}
应用程序编译,但是当我尝试 运行 测试时,编译失败并出现此错误:
Undefined symbols for architecture arm64:
"type metadata accessor for Tester.Transaction", referenced from:
Tests_iOS.Tests_iOS.testExample() throws -> () in Tests_iOS.o
"Tester.Transaction.__allocating_init() -> Tester.Transaction", referenced from:
Tests_iOS.Tests_iOS.testExample() throws -> () in Tests_iOS.o
ld: symbol(s) not found for architecture arm64
我做错了什么?这是在 M1 Mac 上使用 Xcode 13.3
问题很可能是您已将测试添加到创建新 multi-platform 项目时自动创建的测试目标,并且该目标是 UI 测试目标而不是普通单元测试目标。
对于这些测试,您不像交易 class 那样访问应用程序的 public api,而是访问 UI 组件,因此测试框架无法访问交易 class.
解决方案是创建一个新的单元测试目标,文件 -> 新建 -> 目标...和 select 单元测试(记住 select 正确的平台,因为这需要为每个支持的平台单独完成)。
完成后,将您的测试移动到新目标或将其复制到生成的测试文件中,您的测试将构建并且 运行。