Пользовательский OCHamcrest matcher для проверки подлинности OCMockito
Я использую OCHamcrest и OCMockito для модульного тестирования проекта iOS. Я работаю над пониманием, используя пользовательские сопоставления в фиктивной проверке ожидания метода, который принимает параметры. В частности, я хочу проверить один из параметров, переданных ожидаемому методу, но мне нужно разделить переданный параметр, чтобы сделать это. Чтобы продемонстрировать, вот что у меня есть для соответствующей части моего метода испытаний:
EAAccessory *accessory = mock([EAAccessory class]);
UIViewController <ZKSearchManagerDelegate> *mockController =
mockObjectAndProtocol(
[UIViewController class], @protocol(ZKSearchManagerDelegate)
);
[verify(mockController)
zkZSensorFound:isSensorWithAccessory(accessory)
fromSearchManager:_sm];
-zkZSensorFound:fromSearchManager:
берет объект, который содержит EAAccessory
как собственность. В моем собственном сопоставителе мне нужно открыть этот объект и проверить это свойство, чтобы убедиться, что это тот же объект, что и accessory
в рамках этого метода испытаний. Это достаточно легко пройти accessory
в соответствие, как я делаю здесь, но как мне получить фактический объект, который передается параметру для использования внутри моего соответствия? Или я все об этом говорю?
Обновить
Я принял ответ от @JonReid, так как это гораздо более элегантное решение, чем я придумал. Тем не менее, я думаю, что то, что я использовал (благодаря этому сообщению в блоге), могло бы быть полезным в другом месте:
#import "ArgumentCaptor.h"
EAAccessory *accessory = mock([EAAccessory class]);
UIViewController <ZKSearchManagerDelegate> *mockController =
mockObjectAndProtocol(
[UIViewController class], @protocol(ZKSearchManagerDelegate)
);
ArgumentCaptor *captor = argCaptor();
[verify(_mockController) zkZSensorFound:(ZKZSensor *)captor
fromSearchManager:is(sameInstance(_sm))];
ZKZSensor *sensor = captor.argument;
assertThat(sensor.accessory, is(_mockAccessory));
1 ответ
Во-первых, имейте в виду, что когда вы не указываете совпадение с OCMockito, он использует isEqual
согласовани. Это, вероятно, не то, что вы хотите проверить для второго аргумента. Вместо этого я бы проверил личность:
fromSearchManager:sameInstance(_sm)
Если аргумент введен, он будет жаловаться, что совпадение sameInstance
не менеджер по поиску Обходной путь состоит в том, чтобы навести соответствие, чтобы убрать ввод:
fromSearchManager:(id)sameInstance(_sm)
Теперь о первом аргументе: вам, возможно, не нужно вообще создавать пользовательские сопоставления. Если все, что вы хотите сделать, это проверить значение свойства, используйте hasProperty
, Предполагая, что свойство названо accessory
,
zkZSensorFound:(id)hasProperty(@"accessory", sameInstance(accessory))
Собираем все вместе:
[verify(mockController)
zkZSensorFound:(id)hasProperty(@"accessory", sameInstance(accessory))
fromSearchManager:(id)sameInstance(_sm)];