#ios #interface-builder #uidatepicker #ochamcrest
#iOS #конструктор интерфейса #uidatepicker #очамкрест
Вопрос:
Я создал a UIViewController
с UIDatePicker
выходом, соответствующим nib
файлом и правильно установил выход в построителе интерфейса.
Я пытаюсь запустить следующий модульный тест (используя OCHamcrest
библиотеку сопоставления).
- (void)test___datePicker___shouldBeConnected
{
[sut view];
assertThat(sut.datePicker, is(notNilValue()));
}
Где sut
(для «тестируемой системы») — это контроллер представления, который тестируется модулем.
Тем не менее, я продолжаю получать это исключение во время выполнения:
[UIPickerColumnView isDragging]: unrecognized selector sent to instance 0x10dcdcc70
Where 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
помощью модульного тестирования while, и, похоже, у других разработчиков iOS тоже есть эта проблема (https://discussions.apple.com/message/25373309 ).
К сожалению, похоже, что это ошибка в iOS 7 SKD (Xcode 5.1). Однако, похоже, это исправлено в iOS 8 SDK (Xcode 6 beta 1).
Это исключение выдается, если вы обращаетесь UIViewController
к view
свойству a и оно содержит a 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! :]
Комментарии:
1. Это временно устраняет ошибку, однако, как только вы устанавливаете дату в DatePicker, появляется та же ошибка. Похоже, эта ошибка просто помешает нам тестировать это до Xcode 6.