Пользовательский 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)];
Другие вопросы по тегам