開発環境
標準のXCTestでテストケースを書いて実行したらエラー
作っているiOSアプリで独自クラス(以下、ClassDoggo)を定義して、そのテストケースを標準のXCTestで書いたのですが、ビルドエラーとなってしまいました。
xctest ld: symbol(s) not found for architecture arm64
(中略)
Undefined symbol: type metadata accessor for ClassDoggo
Undefined symbol: ClassDoggo.__allocating_init() -> ProjectName.ClassDoggo
一方、切り分けとして、プロジェクト作成時にXCTestのテンプレートで定義されているアプリの起動テストだけで実行したところ、正常にビルドが通り、テストが完了しました。
というわけで、ここではクラスが見つからない原因を探っていきました。
現象:XCTestが独自クラスClassDoggoを認識してくれない
しかし、テストケースを書いたときに、
import XCTest
@testable import ClassDoggo
class Tests_iOS: XCTestCase {
(中略)
func testClassDoggo() throws {
let stub = ClassDoggo()
(中略)
}
}
と、独自クラスClassDoggoをimportしてある上に、コード中の入力補完も効いており、一見、ClassDoggoは認識できているように見えます。
次に、[Project] -> [Tests iOS] -> [Build Setting] や [Build Phases] を一通り見たところ、[Build Phases] に [Compile Sources]という項目を見つけました。
解決:XCTestのコンパイル対象に独自クラスを含める
[Project] -> [Tests iOS] -> [Build Phases] -> [Compile Sources]には、Tests_iOS.swiftが1つだけ設定されているので、試しにClassDoggoを+マークから追加してみました。
そして、テストを実行してみたところ、ビルドが成功し、testClassDoggo()が無事に実行されました。
これって、もしかしてファイルの追加時に何かすれば、Compile Sourcesに自動で追加されるのものだったりするの?と思い、試しにファイルを新規作成してみました。
すると、Xcodeで[New File] -> [Swift File] -> [Next]まで進んだところで、Targetsという項目のTests iOSにチェックが入っていないことが分かりました。
ここでTests iOSにチェックを入れてファイルを新規作成すると、[Project] -> [Tests iOS] -> [Build Phases] -> [Compile Sources]に新規作成したファイルが自動で追加されました。
今まで完全に見落としてましたね。。。