1

私は自分の参考のために単体テストテンプレートプロジェクトを書いています。これには、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 というのは非常に奇妙です。

4

1 に答える 1

4

ビューコントローラーでは、に値を割り当てていませんself.myLabel

self.myLabel = [[UILabel alloc] init];

これはself.myLabelnil 値を持つことを意味するため、次のシーケンスが発生します: [self myLabel]nil を返し、[nil setText:@"test"]何もしません。これらはすべて標準的な動作です。

ペン先またはストーリーボードからView Controllerをロードすると、IBでのアウトレットの描画方法に従ってラベルが割り当てられますが、呼び出しでViewController *vc = [[ViewController alloc] init]はペン先またはストーリーボードはロードされません。


アップデート

私の投稿を読み直した後、私は間違った印象を残したようです.

を追加するのではなく、ペン先またはストーリーボードからロードする必要がありますself.myLabel = [[UILabel alloc] init]

nib からロードするには、-initWithNibName:bundle:代わりに を使用し-initます。ストーリーボードからロードするには、まず を使用してストーリーボードを+[UIStoryboard storyboardWithName:bundle:]ロードし、次に を使用してストーリーボードからビュー コントローラーをロードします-[UIStoryboard instantiateViewControllerWithIdentifier:]

于 2012-10-16T18:50:41.803 に答える