Вы также можете нарисовать линию, чтобы увидеть предел 80:
let &colorcolumn=join(range(81,999),",")
let &colorcolumn="80,".join(range(400,999),",")
Результат:
Тестирование делегата тривиально. Просто установите 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:]
, чтобы вместо этого запустить цикл выполнения именно в этом режиме, что повысит вероятность того, что работа, которую вы ожидаете, будет выполнена.