OCUnit тестируют на протоколы/обратные вызовы/делегата в Objective C

Вы также можете нарисовать линию, чтобы увидеть предел 80:

let &colorcolumn=join(range(81,999),",")
let &colorcolumn="80,".join(range(400,999),",")

Результат:

enter image description here

24
задан Quinn Taylor 10 July 2009 в 14:53
поделиться

1 ответ

Тестирование делегата тривиально. Просто установите ivar в тесте в вашем методе обратного вызова и проверьте его после того, что должно вызывать обратный вызов делегата.

Например, если у меня есть класс Что-то , которое использует делегат протокола ] SomethingDelegate и отправляет этого делегата -something: delegateInvoked: в ответ на какое-то сообщение, я могу проверить его, как ethis:

@interface TestSomeBehavior : SenTestCase <SomethingDelegate>
{
    Something *_object;
    BOOL _callbackInvoked;
}
@end

@implementation TestSomeBehavior

- (void)setUp {
    [super setUp];
    _object = [[Something alloc] init];
    _object.delegate = self;
}

- (void)tearDown {
    _object.delegate = nil;
    [_object release];
    [super tearDown];
}

- (void)testSomeBehaviorCallingBack {
    [_object doSomethingThatShouldCallBack];

    STAssertTrue(_callbackInvoked,
                 @"Delegate should send -something:delegateInvoked:");
}

- (void)something:(Something *)something delegateInvoked:(BOOL)invoked {
    _callbackInvoked = YES;
}

@end

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

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

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

- (void)testSomeBehaviorCallingBack {
    NSDate *fiveSecondsFromNow = [NSDate dateWithTimeIntervalSinceNow:5.0];

    [_object doSomethingThatShouldCallBack];

    [[NSRunLoop currentRunLoop] runUntilDate:fiveSecondsFromNow];

    STAssertTrue(_callbackInvoked,
                 @"Delegate should send -something:delegateInvoked:");
}

Это запустит текущий цикл выполнения в режиме по умолчанию в течение 5 секунд, при условии, что -doSomethingThatShouldCallBack планирует свою работу в основном цикле выполнения в режиме по умолчанию. Обычно это нормально, потому что API, которые работают таким образом, часто позволяют указать цикл выполнения для использования, а также режим для запуска. Если вы можете это сделать, вы можете использовать - [NSRunLoop runMode: beforeDate:] , чтобы вместо этого запустить цикл выполнения именно в этом режиме, что повысит вероятность того, что работа, которую вы ожидаете, будет выполнена.

53
ответ дан 28 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: