Pragmatic ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

SwiftでUnitTestするときに"Use of undeclared type"になる場合の対処法

テストを実行するとこういうエラーがでることがあると思います。

Use of undeclared type 'Todo'

does not have a member named 'todo'

import XCTest
import TodoApp

class TodoTests: XCTestCase {
    var todo: Todo!
    
    override func setUp() {
        super.setUp()
        
        todo = Todo()
    }

たまに解決方法として全部publicにするとかいうのを見かけるのですが、それは間違いです。もしそうだとするとpublicなクラスしかテストできないってことになるので普通に考えたら明らかにおかしいですよね。。

ここから解決方法です。

方法その1

Swift1.x系での対処方法です。Swift2.x系でも使えます。

問題は、Test Targetの設定にあります。 ProjectのUnitTest用のTargetを選択し、Build Phasesのタブを選択します。

f:id:yanamura:20141227145947p:plain

エラーがでる場合は、Compile Sourcesにテスト対象のクラスが追加されていないと思われます。

f:id:yanamura:20141227145949p:plain

そこでこのようにテスト対象のクラスを追加してやればエラーは消えるはずです。

クラスをプロジェクトに追加される際に、どのTargetに対して追加するか聞かれるダイアログがでると思いますが、その際にテストTargetも対象にいれるのを忘れないように気をつけるとこういったことは防げます。

方法その2

Swift2.xから使える方法です。

importの前に@testableをつければよいです。

import XCTest
@testable import TodoApp

RealmなどTestTargetでテスト対象のクラス一緒にコンパイルできない場合はこの方法でやるしかないです。