0

ビュー コントローラーの単体テストは、iPhone 開発の非常に重要な部分のようです (この記事を参照してください)。ただし、これには Nib からコントローラーを初期化する必要があり、論理テストで適切に行うことは不可能であることがわかりました。

論理テストでのバンドルからのリソースのロード(この質問を参照)は正常に機能します。次のように Nibs をロードすることも可能です:

    UntitledViewController* controller = [[UntitledViewController alloc]initWithNibName:nil bundle:[NSBundle bundleForClass:[self class]]];

. ただし、ペン先にUIViewsのみが含まれている場合にのみ機能します。他のビュー (私は UITableView と UISwitch を試しました) では、otest がコード 138 で失敗します。

論理テストを使用して Nib をテストすることは可能ですか?

4

2 に答える 2

2

それはあなたが何をテストしようとしているのかによります。バインディングが正しく設定されていることを確認したい場合は、Cocoaインターフェースの単体テストに関するChrisHansonの記事を読んでください。個人的には、これはやり過ぎであり、あまり役に立たないテストコードの急増につながると思います。しかし、それは私の2セントです。

テストでこれらのインターフェイス要素を実際に操作しようとすると、特にUIActionSheetsとUITableViewsで、最終的に多くのotestエラーが発生します。

ただし、目標は、AppleのUIオブジェクトの動作ではなく、コントローラーの動作を単体テストすることです。私が最もよく機能するのは、OCMockを使用してUI要素をモックし、コントローラーがそれらに対して予期された呼び出しを行うことを確認することです。次にいくつかの例を示します。

  -(void)testClickingAButtonHidesAView {
     //setup
     id mockViewToHide = [OCMockObject mockForClass:[UIView class]];
     [[mockViewToHide expect] setHidden:YES];
     [controller setSomeView:mockViewToHide];

     // hideButtonClicked is an IBAction that is the hide button's target
     [controller hideButtonClicked];
     [mockViewToHide verify];
  }

  -(void)testActionSheetPublishClick {
     // ModelManager is the controller's dependency, which publishes Items
     id mockModelManager = [OCMockObject mockForClass:[ModelManager class]];
     [controller setModelManager:mockModelManager];

     // this doesn't really need to be mocked, but it's a convenient way to create
     // a reference you can validate in expect:
     id mockItem = [OCMockObject mockForClass:[Item class]];
     [controller setCurrentItem:mockItem];

     // when the user clicks "Publish" (the first button on the action sheet), 
     // the controller should publish the current item
     [[mockModelManager expect] publishItem:mockItem];

     // stub object so I know which action sheet was clicked
     id mockPublishActionSheet = [OCMockObject mockForClass:[UIActionSheet class]];
     [controller setPublishConfirmation:mockPublishActionSheet];

     // simulate action sheet click
     [controller actionSheet:mockPublishActionSheet didDismissWithButtonIndex:0];

     [mockModelManager verify];
  }
于 2010-07-08T19:04:05.973 に答える
0

代わりにアプリケーション テストを使用し、デバイスで UI を駆動/検査します。

于 2011-04-04T02:46:57.567 に答える