web-dev-qa-db-ja.com

Swiftで独自のViewControllerをユニットテストするときに未宣言のタイプ「ViewController」を使用していますか?

ViewControllerをテストするためにSwiftでテストケースを記述しようとしています。ただし、XCTestCaseで独自のViewControllerをインスタンス化しようとすると、 「宣言されていないタイプ「ViewController」の使用」。 (ViewControllerは自分のUIViewControllerクラスの名前です)

enter image description here

他の誰かが以前にこの問題に直面したことがありますか? Xcode 6ベータ5を使用しています

23
hoomi

スイフト1

フレームワークを使用していない場合も、ViewController.Swiftファイルのターゲットメンバーシップをテストターゲットとして追加する必要があります。イメージに示すように、ターゲットに追加するクラスファイルを選択します。

enter image description here

OR

ViewControllerがフレームワーク内にある場合:ViewControllerクラスは異なるターゲットにあり、パブリックアクセスレベルを持つクラスを宣言していません。デフォルトでは、クラスは内部(ターゲット内でアクセス可能)です。それをパブリックとして宣言し、アクセスしたい場合はメソッドまたはプロパティをパブリックとして作成します

public class ViewController: UIViewController {

    public var content: String!

    override public func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override public func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

Swift 2アップデート

テストターゲットで、@testableキーワードを使用して、テストするモジュールをインポートします。

@testable import moduleToTest

これで、テストターゲットのpublicおよびinternalシンボルにアクセスできます。

Swift 2 Xcode 7単体テスト

47
Yatheesha B L

また、最近このエラーが発生しましたが、上記の手順のいずれも問題を解決しませんでした。それを修正したのは、ソースコンパイルフェーズから非Swiftファイルを削除することでしたテストを実行するターゲットで。

アプリが実際にコンパイルされていることを確認してください。これは黙って失敗し、エラーメッセージは役に立ちませんでした

enter image description here

3
amleszk

Swift 4では、新しい単体テストターゲットを作成できます。以下に示すように、選択したターゲットをインポートする必要があります

View Controller内のロジックをテストするには、それへの参照が必要です。これにより、viewControllerに到達するためには、以下に示すように、最初にストーリーボードへの参照が必要です。

// Put setup code here. This method is called before the invocation of each test method in the class.
let storyBoard = UIStoryboard(name: "Main", bundle: Bundle.main)
    viewController = storyBoard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
    _ = viewController.view

前のコードをsetUpメソッド内に挿入する必要があります。このメソッドは、単体テストが実行されるたびに呼び出されます。以下に添付されているスクリーンショットに記載されているように、viewControllerはXCTestCaseクラス内で定義された変数です。

今のところ、viewController.funCodeまたはviewController.variableを呼び出すことにより、viewControllerクラス内で定義されたロジックにアクセスできます。

ここに画像の説明を入力

忘れないでください:ストーリーボードでView Controllerにアクセスするには、識別する必要があります。そのためには、ストーリーボードに移動し、viewControllerを選択してから、右側のパネルから「IDインスペクタを表示」に移動し、ストーリーボードID = 'ViewController'の値を設定します。

詳細については、以下をご覧ください: https://github.com/msabukwaik/networking-example

0