私は自分の参考のために単体テストテンプレートプロジェクトを書いています。これには、viewDidLoad 後に UILabel のテキスト プロパティが期待どおりに設定されていることを確認するなど、すべての基本的なタスクのテンプレート コードが含まれます。
UILabel が 1 つある ViewController を含むストーリーボードがあります。viewDidLoad で、テキストを設定しました。次に、テストは、テキストが期待どおりに設定されているかどうかをアサートしますが、何らかの理由で、UILabel は常に nil です。アプリを実行すると、すべてが期待どおりに機能します(神に感謝します)。予想されるテキストのラベルが付いた白いビューが表示されます。
テスト フレームワークとして Kiwi を使用し、Xcode v4.5 を使用しています。
ここにいくつかのコードがあります:
ViewController.h:
@property (strong, nonatomic) IBOutlet UILabel *myLabel;
ViewController.m:
- (void)viewDidLoad {
myLabel.text = @"test";
}
ViewControllerTests.m:
ViewController *vc = [[ViewController alloc] init];
// create view in memory by calling view's getter
[vc view];
// set myLabel.text to "test"
[vc viewDidLoad];
[vc.myLabel shouldNotBeNil];
[[vc.myLabel.text should] equal:@"test"];
上記のテストは失敗し、myLabel が nil であることがわかります。
This StackOverflow answerは、loadViewを呼び出すとメモリ内にビュー階層が作成され、それによってサブビューが使用できるようになると述べています。ドキュメントによると、ViewController ビューの getter を呼び出すだけで、loadView が呼び出され、すべてのビューが作成されます。したがって、テスト時に myLabel = nil というのは非常に奇妙です。