Задержка проверки / обработки OCMock с тайм-аутом в модульных тестах - PullRequest
6 голосов
/ 05 сентября 2011

Я тестирую реальные вызовы веб-сервисов с помощью OCMock.

Сейчас я делаю что-то вроде:

- (void)testWebservice
{
    id mydelegatemock = [OCMockObject mockForProtocol:@protocol(MySUTDelegate)];
    [[mydelegatemock expect] someMethod:[OCMArg any]];

    [SUT sutWithDelegate:mydelegatemock];

    // we need to wait for real result
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];

    [(OCMockObject*)mydelegatemock verify];
}

Работает нормально, но подразумевает, что каждый такой тест займет 2 секунды.

Есть ли способ установить время ожидания, например, 2 секунды и разрешить вызов someMethod из mydelegatemock немедленно verify и завершить тестовый набор?

Ответы [ 3 ]

6 голосов
/ 06 сентября 2011

Я делаю это с помощью удобной служебной функции, которую я нашел по этой ссылке :

#import <Foundation/Foundation.h>
#import <OCMock/OCMock.h>

@interface TestUtils : NSObject
+ (void)waitForVerifiedMock:(OCMockObject *)mock delay:(NSTimeInterval)delay;
@end

И реализация:

#import "TestUtils.h"
@implementation TestUtils

+ (void)waitForVerifiedMock:(OCMockObject *)inMock delay:(NSTimeInterval)inDelay
{
    NSTimeInterval i = 0;
    while (i < inDelay)
    {
        @try
        {
            [inMock verify];
            return;
        }
        @catch (NSException *e) {}
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
        i+=0.5;
    }
    [inMock verify];
}

@end

Это позволяет мне ждать до максимальной задержки (в секундах), не ожидая полной суммы каждый раз.

1 голос
/ 06 сентября 2011

Я бы отделил функциональное тестирование ваших веб-сервисов (если вам вообще нужно это сделать) от модульного тестирования вашего класса, который обрабатывает результат веб-сервиса.

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

Если вы также хотите провести функциональное тестирование вашего веб-сервиса (скажем, что он возвращает конкретный ответ при некотором запросе), вам не нужно ничего подделывать - просто позвоните в сервис и сделайте утверждения о результате. 1005 *

Разделяя ваши тесты, вы лучше контролируете их выполнение. Например, вы можете запускать свои быстродействующие модульные тесты каждый раз, когда вы меняете код, но запускать свои медленно работающие функциональные тесты ночью, на выделенном сервере или по мере необходимости. И когда тест прервется, вы узнаете, что это за код или что-то не так с веб-сервисом.

0 голосов
/ 10 мая 2012

Вы также можете переключиться на GHUnit, как предлагает один из участников в ответе на этот связанный вопрос:

SenTestingKit в Xcode 4: асинхронное тестирование?

Вы можете найти GHUnit здесь

https://github.com/gabriel/gh-unit

...