2014-06-18 20 views
1

我創建了一個UIViewControllerUIDatePicker出口,對應nib文件,並正確設置在接口構建器的出口。入門運行時異常而單元測試的UIDatePicker([UIPickerColumnView isDragging:]無法識別選擇)

我試圖運行以下單元測試(使用OCHamcrest matcher庫)。

- (void)test___datePicker___shouldBeConnected 
{ 
    [sut view]; 
    assertThat(sut.datePicker, is(notNilValue())); 
} 

其中sut(對於「被測系統」)是單元測試的視圖控制器。

不過,我不斷收到此運行時異常:

[UIPickerColumnView isDragging]: unrecognized selector sent to instance 0x10dcdcc70 

哪裏UIPickerColumnView我創建了一個類(它似乎是在UIKit使用非公共類)。

我試圖去除筆尖UIDatePicker和編程方式創建它:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIDatePicker *datePicker = [[UIDatePicker alloc] init]; 
    [datePicker setDate:[NSDate date]]; 
    [datePicker addTarget:self action:@selector(dateChanged:) 
    forControlEvents:UIControlEventValueChanged]; 
    [self.view addSubview:datePicker]; 
} 

然而,同樣發生異常。

隨着異常斷點,這裏是錯誤的線程:

#0 0x0000000100857973 in objc_exception_throw() 
#1 0x0000000100c8065d in -[NSObject(NSObject) doesNotRecognizeSelector:]() 
#2 0x0000000100be0d8d in ___forwarding___() 
#3 0x0000000100be0938 in __forwarding_prep_0___() 
#4 0x00000001066c5b6e in -[UIPickerView _sendSelectionChangedFromTable:notify:]() 
#5 0x00000001066c5fec in -[UIPickerView _selectRow:inComponent:animated:notify:]() 
#6 0x0000000106c7bac7 in -[_UIDatePickerView _selectRow:inComponent:animated:notify:]() 
#7 0x0000000106c81c3f in -[_UIDatePickerMode loadDate:animated:]() 
#8 0x0000000106c85456 in -[_UIDatePickerMode_DateAndTime loadDate:animated:]() 
#9 0x0000000106c7ba8b in -[_UIDatePickerView _loadDate:animated:]() 
#10 0x0000000106c7b26b in -[_UIDatePickerView _setDate:animated:forced:]() 
#11 0x0000000106911c0e in -[UIDatePicker initWithCoder:]() 
#12 0x0000000106a6a794 in UINibDecoderDecodeObjectForValue() 
#13 0x0000000106a6a4df in -[UINibDecoder decodeObjectForKey:]() 
#14 0x000000010692e198 in -[UIRuntimeConnection initWithCoder:]() 
#15 0x0000000106a6a794 in UINibDecoderDecodeObjectForValue() 
#16 0x0000000106a6a95c in UINibDecoderDecodeObjectForValue() 
#17 0x0000000106a6a4df in -[UINibDecoder decodeObjectForKey:]() 
#18 0x000000010692d7b6 in -[UINib instantiateWithOwner:options:]() 
#19 0x00000001067c7b0c in -[UIViewController _loadViewFromNibNamed:bundle:]() 
#20 0x00000001067c8149 in -[UIViewController loadView]() 
#21 0x00000001067c83b7 in -[UIViewController loadViewIfRequired]() 
#22 0x00000001067c8777 in -[UIViewController view]() 
#23 0x0000000102e01c86 in -[AODateTimeDetailViewControllerTests test___datePicker___ShouldBeConnected] at /Users/Anthony/Documents/AORepos/AOReportControllers/AOReportControllersTests/AODateTimeDetailViewControllerTests.m:43 
#24 0x0000000100be4f1c in __invoking___() 
#25 0x0000000100be4dc4 in -[NSInvocation invoke]() 
#26 0x0000000102cb9c40 in -[XCTestCase invokeTest]() 
#27 0x0000000102cb9d2c in -[XCTestCase performTest:]() 
#28 0x0000000102cbaa75 in -[XCTest run]() 
#29 0x0000000102cb94df in -[XCTestSuite performTest:]() 
#30 0x0000000102cbaa75 in -[XCTest run]() 
#31 0x0000000102cb94df in -[XCTestSuite performTest:]() 
#32 0x0000000102cbaa75 in -[XCTest run]() 
#33 0x0000000102cb94df in -[XCTestSuite performTest:]() 
#34 0x0000000102cbaa75 in -[XCTest run]() 
#35 0x0000000102cbc1b4 in +[XCTestProbe runTests:]() 
#36 0x00000001000012e1 in ___lldb_unnamed_function9$$xctest() 
#37 0x0000000100001521 in ___lldb_unnamed_function11$$xctest() 
#38 0x0000000100001017 in ___lldb_unnamed_function2$$xctest() 

我怎樣才能防止,而單元測試UIDatePicker被拋出此異常?

回答

1

我可以在單元測試的時候用UIDatePicker確認這個行爲,而且似乎其他的iOS開發者也有這個問題(https://discussions.apple.com/message/25373309)。

不幸的是,這似乎是iOS 7 SKD(Xcode 5.1)中的一個錯誤。但是,它似乎在iOS 8 SDK(Xcode 6 beta 1)中得到修復。

,如果你訪問一個UIViewControllerview屬性時拋出此異常,它包含一個UIDatePicker,這是你通常如何導致view及其網點進行單元測試時的設置。

下面是我用得到它周圍的解決方案:

@interface YourViewControllerTests 
@end 

@implementation YourViewControllerTests 
{ 
    YourViewController *sut; 
    UIDatePicker *datePicker; 
} 

- (void)setUp 
{ 
    [super setUp]; 

    sut = [[YourViewController alloc] initWithNibName:@"YourViewController" bundle:[NSBundle bundleForClass:[self class]]]; 
    [self givenViewSetup]; 
} 

- (void)givenViewSetup 
{ 
    @try { 
    [sut view]; 
    } 
    @catch (NSException *exception) { 
    // ignore the exception 
    } 
    @finally { 
    datePicker = [[UIDatePicker alloc] init]; 
    sut.datePicker = datePicker; 
    } 
} 

- (void)test___datePicker___shouldBeConnected 
{ 
    assertThat(sut.datePicker, is(notNilValue())); 
} 

@end 

當你UIDatePicker出口在技術上並不單元測試,現在,至少你可以用測試的休息您的視圖控制器繼續。

當然,一旦切換到Xcode 6,一定要放棄這個試試看的廢話! :]

+0

這確實會暫時消除錯誤,但只要您在datePicker上設置日期,就會出現相同的錯誤。看起來這個bug會阻止我們單元測試,直到Xcode 6。 – AnthonyM

相關問題