Xcode+XCTestで独自クラスのテストでエラーになった

開発環境

  • Xcode 13.3.1
  • Swift 5
  • Target:iOS 15.4

標準の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]に新規作成したファイルが自動で追加されました。

今まで完全に見落としてましたね。。。