Убедитесь, что метод был вызван из другого объекта OCMock

У меня два класса.

Объект 1:

- (void) methodA {
    ObjectB objectB = [[ObjectB alloc] init];
    [objectB methodB];
}

И Объект 2:

- (void) methodB {
     // Does something
}

Как с помощью OCMock убедиться, что methodA вызывает methodB? Я настраиваю тест следующим образом:

id mock = OCMClassMock([Object2 class]);
OCMStub([mock methodB).andReturn(nil);

[self.object1 methodA];
OCMVerify([mock methodB]);

Тестовый класс тестирует объект1, но я хотел бы убедиться, что он вызывает метод для объекта2. При запуске этого теста я получаю сообщение об ошибке:

Method methodB was not invoked.

Я все еще новичок в mocks/stubs. Вполне возможно, что я неправильно строю тест. Макет меня немного смущает, потому что я тестирую Object1, но пытаюсь что-то проверить на Object2.

Правильно ли я думаю, когда настраиваю этот тест? Если нет, то как мне подойти к этому?


person nland    schedule 23.03.2016    source источник


Ответы (1)


Вы должны убедиться (каким-то образом), что Object1 использует макет, а не новый экземпляр ObjectB. Обычным подходом для этого является внедрение зависимостей, т.е. Object1 имеет зависимость от Object2, но вместо того, чтобы Object1 создавал экземпляр Object2, экземпляр Object2 устанавливается извне (внедряется). В сети про это огромное количество материалов.

С OCMock вы можете обойти это другим способом. Однако это не рекомендуется. Вы можете заменить alloc/init на new, а затем заглушить метод класса new, чтобы вернуть макет. Таким образом, Object1 будет использовать макет, даже не подозревая об этом. Он по-прежнему будет «думать», что выделил новый экземпляр Object2.

id mock = OCMClassMock([Object2 class]);
OCMStub([mock new]).andReturn(mock);
OCMStub([mock methodB).andReturn(nil);

[self.object1 methodA];
OCMVerify([mock methodB]);

Это упоминается в справочной документации в 9.3. Методы-заглушки, создающие объекты.

person Erik Doernenburg    schedule 23.03.2016