Сбой при проверке OCMock 'initWithAttributedString' на NSMutableAttributedString
Я пытаюсь понять, что смешно, а что нет.
В эксперименте с NSMutableAttributedString я, кажется, не в состоянии издеваться initWithAttributedString
,
- (void)test_mutableString_shouldWorkAsAMutableString {
NSMutableAttributedString *_mutable = [OCMockObject mockForClass:NSMutableAttributedString.class];
NSAttributedString *_string = [OCMockObject mockForClass:NSAttributedString.class];
[[[(id)_mutable expect] andReturnValue:nil] initWithAttributedString:_string];
[_mutable initWithAttributedString:_string];
}
Этот код не будет работать; по какой-то причине прокси для изменяемого экрана не распознает initWithAttributedString
селектор:
2013-03-12 11:25:30.725 UnitTests[11316:c07] TestItClass/test_4_mutableString_shouldWorkAsAMutableString ✘ 0.00s
Name: NSInvalidArgumentException
File: Unknown
Line: Unknown
Reason: *** -[NSProxy doesNotRecognizeSelector:initWithAttributedString:] called!
0 CoreFoundation 0x01c0602e __exceptionPreprocess + 206
1 libobjc.A.dylib 0x01948e7e objc_exception_throw + 44
2 CoreFoundation 0x01c05deb +[NSException raise:format:] + 139
3 Foundation 0x00862bcd -[NSProxy doesNotRecognizeSelector:] + 75
4 CoreFoundation 0x01bf5bbc ___forwarding___ + 588
5 CoreFoundation 0x01bf594e _CF_forwarding_prep_0 + 14
6 UnitTests 0x00349e0b -[TestItClass test_4_mutableString_shouldWorkAsAMutableString] + 283
Я пытаюсь понять, как я могу надежно использовать OCMock, но это сбивает меня с толку, и я не уверен, какие вызовы OCMock я могу ожидать, а какие нет.
Я был бы очень признателен за разъяснения по этому поводу и намеки на то, почему вышесказанное не работает.
Спасибо джо
1 ответ
Я узнал кое-что о Objective-C, пытаясь понять это.
Ваша основная проблема заключается в том, что класс объекта, созданного с помощью alloc'ing NSMutableAttributedString, не является NSMutableAttributedString (всегда опасайтесь бесплатных платных мостовых классов). Чтобы заставить ваш код работать, попробуйте следующее:
NSMutableAttributedString *realMutable = [[NSMutableAttributedString alloc] init];
id mutable = [OCMockObject niceMockForClass:[realMutable class]];
id string = [OCMockObject niceMockForClass:[NSAttributedString class]];
[[[mutable expect] andReturn:@"YO" ] initWithAttributedString:string];
NSLog(@"MOCK: %@", [mutable initWithAttributedString:string]);
[mutable verify];
// Outputs 'MOCK: YO' and passes