Как справиться с сбоями в цели модульного тестирования в приложении Mac OS

#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. Большое вам спасибо за помощь, Кристик. Это именно то, что я искал.