Как я могу использовать объекты OCMock с кодом, который вызывает isKindOfClass? - PullRequest
7 голосов
/ 29 января 2009

Я хотел бы протестировать некоторый код с OCMock.

Внутренности кода вызывают [NSObject isKindOfClass] для фиктивного объекта, который я передаю в код, например:

if ([object isKindOfClass:[FancyClass class]]) { ...}

Однако, когда я предоставляю макет на основе OCMockObject, созданный так:

mock = [OCMockObject mockForClass:[FancyClass class]];

похоже, что он не проходит тест isKindOfClass.

Есть предложения?

Ответы [ 2 ]

8 голосов
/ 29 января 2009

Общее правило заключается в том, что если вы звоните isKindOfClass: и не проходите один из классов plist (например, NSString или NSNumber), вы делаете это неправильно.

Если метод выполняет две или более разные вещи в зависимости от того, к какому классу относится его аргумент, разведите его на несколько методов и протестируйте каждый метод отдельно.

Если метод выполняет только одно, но должен взаимодействовать с объектом по-разному, в зависимости от того, к какому классу он относится, то:

  1. Составьте протокол. (Протоколы в Obj-C называются «интерфейсами» в некоторых других языках OO, таких как Java.)
  2. Пусть все классы соответствуют протоколу. При необходимости используйте категории для добавления необходимых методов извне.
  3. Выполните проверку тестируемого метода на соответствие протоколу вместо текущей isKindOfClass: проверки.
  4. Заставить тестируемый метод использовать методы из протокола.
2 голосов
/ 06 мая 2013

А как же:

    [[[mock stub] andReturnValue:OCMOCK_VALUE((BOOL) {YES})] isKindOfClass:[FancyClass class]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...