Как использовать XCGLogger в тестовой цели в Swift 3?

Я уже давно использую XCGLogger, но после преобразования моего приложения в swift 3.0 у меня возникли проблемы с ним в моей тестовой цели.

У меня есть следующее как часть моего файла класса AppDelegate. Это создает глобальную переменную log, которую я могу использовать в любом месте своего приложения, просто вызвав, например, log?.info("foo").

До перехода на swift 3 это работало и в тестовой цели, но теперь я получаю ошибку ссылки, если пытаюсь использовать log?.info("foo") в своей тестовой цели.

Код делегата приложения

import XCGLogger

// USE_XCGLOGGER is set for debug but not for release

#if USE_XCGLOGGER
let log: XCGLogger? = {
  // Setup XCGLogger
  let log = XCGLogger.default      
  return log
}()
#else
let log: XCGLogger? = nil
#endif

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
 ...
}

Класс в тестовой цели

import XCTest
@testable import OurLatitude

class ApiAccessTests: XCTestCase {

    override func tearDown() {
        super.tearDown()
        log?.info("foo")
    }

}

Ошибки ссылки

undefined symbols for architecture x86_64:
  "XCGLogger.XCGLogger.(info (@autoclosure () -> Any?, functionName : Swift.StaticString, fileName : Swift.StaticString, lineNumber : Swift.Int, userInfo : [Swift.String : Any]) -> ()).(default argument 4)", referenced from:
      OurLatitudeTests.ApiAccessTests.tearDown () -> () in ApiAccessTests.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

person nPn    schedule 17.12.2016    source источник
comment
вы нашли решение для этого?   -  person u.gen    schedule 27.03.2017
comment
Я признаю, что не тратил слишком много времени на то, чтобы понять это (я просто комментирую операторы журнала в своих тестах), поэтому нет. И я только что попытался раскомментировать одно из утверждений, и ошибка вернулась. Возможно, было обновление для XCGLogger, которое исправляет это? Я должен буду посмотреть.   -  person nPn    schedule 27.03.2017
comment
Я исправил это. опубликую ответ   -  person u.gen    schedule 27.03.2017


Ответы (1)


Я использую Carthage, и мои настройки модульного теста Host Application : None .

Я подумал, что фреймворк не был добавлен в цель модульного тестирования, и я был прав. Поэтому я добавил XCGLogger.framework из папки carthage в Link Binary with Libraries на этапе сборки. Затем я также добавил фреймворк в сценарий запуска.

введите здесь описание изображения

Это решило ошибку, которую я получал, и я начал получать новую ошибку

Ambiguous reference to member 'log'

Затем создание одноразового класса для инициализации XCGLogger решило это.

Я создал здесь запрос на вытягивание, надеюсь, он его объединит....

https://github.com/DaveWoodCom/XCGLogger/pull/188/files

Использование с модульными тестами. [после установки Carthage или вручную]

Убедитесь, что ваш XCGLogger.framework добавлен в ваши этапы сборки Unit Test Target -> Link Binary With Libraries.

Я также добавил скрипт запуска, чтобы убедиться, что фреймворк скопирован из папки Carthage.

Если для хост-приложения вашего модульного теста установлено значение «Нет», а классы вашего приложения используют XCGLogger, вы увидите ошибку, например

Ambiguous reference to member 'log' Это происходит потому, что XCTest запускает ваши модульные тесты один за другим и не имеет доступа к вашему конструктору XCGLogger в вашем файле AppDelegate. Таким образом, ваш одноразовый init не существует, и он не может найти правильные ссылки.

Чтобы решить эту проблему, вам понадобится одноразовый метод инициализации, который создаст ваш XCGLogger

Создайте новый класс в своей тестовой цели, убедитесь, что он называется TestSetup

import XCGLogger

let log: XCGLogger = {
    // Setup XCGLogger
    let log = XCGLogger.default

    return log
}()


class TestSetup: NSObject {
    override init() {

    }
}

затем перейдите к настройкам информации о ваших тестовых целях и добавьте новую строку Principal class, а значение будет YourTestTargetName.TestSetup . time-setup-code-before-executing-any-xctest">Как запустить одноразовый код установки перед выполнением любого XCTest

Это должно сработать....

person u.gen    schedule 27.03.2017