#swift #xcode #macos #unit-testing #cocoa
Вопрос:
В приложении мы можем зарегистрировать приведенный ниже набор кода для отслеживания сбоев
signal(SIGILL) { _ in
print("Signal Kill")
}
ncaughtExceptionHandler { exception in
print("Exception caught: (exception)")
}
Но я хочу достичь этого и в задаче модульного тестирования. Как я могу это сделать?
Комментарии:
1. Есть ли что-то, что мешает вам использовать один и тот же код в модульных тестах?
2. В моем проекте более 2000 модульных тестов. Поэтому пытаюсь найти единственное место, где я мог бы зарегистрировать обработчиков.
3. Где в приложении зарегистрирован обработчик сигнала? Можете ли вы применить ту же технику для целевого объекта модульных тестов?
4. В приложении, которое я зарегистрировал в AppDelegate, в методе AppDidFinishLaunching
Ответ №1:
Если вам необходимо установить обработчики сигналов перед запуском модульных тестов, вы можете создать .m
файл, аналогичный этому:
// setup.m
static void __attribute__((constructor)) setup() {
// switch to Swift as soon as possible :)
[MySignalHandlers installAllHandlers];
}
, а затем создайте класс Swift, который выполняет фактическую работу. Конечно, вы могли бы написать обработчики сигналов в Objective-C, но поскольку они уже есть в Swift, вы можете повторно использовать эту логику.
// MySignalHandlers.swift
class MySignalHandlers: NSObject {
@objc static func installAllHandlers() {
// do your thing here
}
}
Функции, украшенные __attribute__((constructor))
, автоматически выполняются при загрузке двоичного файла, который их содержит, поэтому это гарантирует, что обработчики сигналов будут установлены до запуска любых модульных тестов.
Комментарии:
1. Большое вам спасибо за помощь, Кристик. Это именно то, что я искал.