Использование структуры с OCMock или Hamcrest

Я натыкаюсь на препятствие, и мне интересно, могут ли здесь помочь блестящие коллективные умы. В ObjC CocoaTouch я пытаюсь смоделировать объект, который принимает параметры структуры и возвращает структуру. OCMock кашляет комком волос, поэтому я попытался обернуть его с помощью Hamcrest Matcher. Нет смерти. Функция/метод, который я тестирую, выглядит примерно так:

- (CLLocationCoordinate2D)pixelToLatLong:(CGPoint)aPoint;

Я использую такой код:

#define OCMOCK_STRUCT(atype, variable) [NSValue value:&variable withObjCType:@encode(atype)]
-(void) testMyWidget
{
    CLLocationCoordinate2D ulLL = (CLLocationCoordinate2D){123,456};
    CLLocationCoordinate2D lrLL = (CLLocationCoordinate2D){654,321};
    [[[(id)myObj expect] andReturn:OCMOCK_STRUCT(CLLocationCoordinate2D, ulLL)] pixelToLatLong:(CGPoint){0,0}];
    [[[(id)myObj expect] andReturn:OCMOCK_STRUCT(CLLocationCoordinate2D, lrLL)] pixelToLatLong:(CGPoint){320,460}];//lower right point
}

Это вроде работает. Итак, в моем объекте, который я тестирую, я вношу необходимые необходимые изменения, чтобы получить зеленую полосу... э-э... зеленую кнопку в окне информации о сборке. Когда я уверен, что мой тест должен пройти, я получаю ошибки утверждения. Ошибки сообщают мне, что метод был вызван неожиданно и перечисляет значения для этих структур как вопросительные знаки. Я пытался обернуть структуры сопоставителями Hamcrest, но ничего не получаю. Я готов развернуть свой отладчик, который, без сомнения, покажет мне, что не так. У кого-нибудь здесь были подобные проблемы с OCMock/Hamcrest и структурами? Если да, то как лучше всего обращаться с этими типами?


person Cliff    schedule 05.02.2009    source источник


Ответы (4)


Вы очень близко. Ваш #define должен быть:

#define OCMOCK_STRUCT(atype, variable) [NSValue valueWithBytes:&variable withObjCType:@encode(atype)]
person user360517    schedule 07.06.2010

На самом деле лучший ответ дал сам Клифф: http://codeforfun.wordpress.com/2009/02/07/ocmock-return-a-struct/

Он просто не обновил этот вопрос, позор позор :)

person RefuX    schedule 21.02.2011

У меня были проблемы с макроответом; написание вспомогательной функции, возвращающей структуру в тестовом классе, и использование:

[[[mockObject stub] andCall:@selector(selectorName) onObject:self] someMethod];

работал очень хорошо.

person DogpatchTech    schedule 30.09.2010

Иногда создать фиктивный код вручную проще, чем пытаться заставить фреймворк фиктивного объекта выйти за рамки его обычных шаблонов использования.

person Jon Reid    schedule 09.01.2010