Сбой при проверке 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
Другие вопросы по тегам