Модульное тестирование метода с задержкой в ​​Objective-C - PullRequest
1 голос
/ 12 декабря 2011

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

- (void) doSomething {
    // Do something
    [self performSelector:@selector(doSomethingLater) withObject:nil afterDelay:kDelay];
}

- (void) doSomethingLater { }

Где kDelay является константой, а doSomethingLater является частной.Проблема в том, что kDelay равен 1 секунде, и я не хочу замедлять выполнение модульных тестов.

Каков наилучший способ для модульного тестирования doSomething при подходе черного ящика (или как можно больше)?

Единственное, что приходит на ум, - это добавить в класс метод для изменения значения kDelay, но он может быть использован другим разработчиком случайно.Есть ли менее агрессивная альтернатива?

Ответы [ 3 ]

0 голосов
/ 12 декабря 2011

Первое, на что я посмотрю, это обнаружение того, что метод был выполнен. Так что, как сказал @Rob, я бы посмотрел на алкоголь другим методом. Вероятно, один локальный для теста, который установил bool, чтобы указать, что он был вызван.

Следующая проблема - уменьшение задержки. Поскольку KDelay является константой, вы ничего не можете с этим поделать. Вы можете изменить его на частное свойство или что-то, к чему вы можете получить доступ в тесте и установить, но все еще является закрытым для производственного кода.

Другой вариант (который я не рассматривал, чтобы увидеть, возможно ли это!) - это не столько беспокоиться об обнаружении выполняемого метода, сколько выяснить, можете ли вы обнаружить, что вызов является стеком циклов выполнения, ожидая быть выполненным. Если вы можете обнаружить присутствие ожидающего вызова, а не сам вызов, то вы можете сделать это немедленно, и задержка станет неактуальной.

0 голосов
/ 12 декабря 2011

Будет ли ваш тест хотеть убедиться, что doSomethingLater был вызван и что он сделал то, что должен был сделать, и все, что вы пытаетесь сделать, это сократить время задержки? Если это так, я рекомендую вам создать закрытый метод, который возвращает постоянное значение для doSomething. Что-то вроде:

@implementation MyClass

- (NSUInteger) getDelay {
    return kDelay;
} 

@end

Затем вы можете остановить реализацию getDelay во время выполнения, используя различные функции, такие как OCMock, другие тестовые фреймворки.

0 голосов
/ 12 декабря 2011

Я не знаю, менее ли он инвазивен, но вы могли бы воспользоваться методом -[NSObject performSelector:withObject:afterDelay:] своей собственной версией, которая не задерживается.

Swizzling означает замену реализации метода во время выполнения. Проверьте бесплатный JRSwizzle library.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...