【问题标题】:How can iPhone Nibs be Unit Tested using Logical Tests?iPhone Nibs 如何使用逻辑测试进行单元测试?
【发布时间】:2010-07-08 15:51:49
【问题描述】:

单元测试视图控制器似乎是 iPhone 开发中非常重要的一部分 (see this Article)。然而,这需要从 Nib 初始化控制器,我发现在逻辑测试中无法正确完成。

在逻辑测试中从 Bundle (see this Question) 加载资源工作正常。甚至可以像这样加载 Nib:

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

。然而,它只有在 nib 只包含 UIViews 时才有效。其他视图(我尝试了 UITableView 和 UISwitch)导致 otest 失败,代码为 138。

是否可以使用逻辑测试来测试我的 Nib,如果可以,如何?

【问题讨论】:

    标签: objective-c iphone unit-testing octest


    【解决方案1】:

    这取决于您要测试的内容。如果您想验证您的绑定设置是否正确,请阅读Chris Hanson's article on unit testing your Cocoa interface。我个人认为这是矫枉过正,并导致测试代码的扩散不是很有用。但这只是我的 2 美分。

    如果您真的尝试在测试中与这些界面元素进行交互,您最终会遇到很多实际错误,正如您所发现的,尤其是 UIActionSheets 和 UITableViews。

    但您的目标应该是对控制器的行为进行单元测试,而不是对苹果的 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];
      }
    

    【讨论】:

      【解决方案2】:

      改用应用程序测试并在设备上驱动/检查您的 UI。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-27
        • 2017-03-14
        • 1970-01-01
        • 1970-01-01
        • 2014-06-27
        相关资源
        最近更新 更多