如何在swift 3中的测试目标中使用XCGLogger?

时间:2016-12-17 17:58:19

标签: swift3 xcode8 xcglogger

我一直在使用XCGLogger一段时间,但在将我的应用程序转换为swift 3.0后,我在测试目标中遇到了问题。

我将以下内容作为AppDelegate类文件的一部分。这会创建一个全局变量log,我可以在我的应用中的任何位置使用,例如调用log?.info("foo")

在转移到swift 3之前,这也适用于测试目标,但是如果我尝试在我的测试目标中使用log?.info("foo"),我现在会收到链接错误。

AppDelegate代码

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)

1 个答案:

答案 0 :(得分:3)

我使用Carthage,单位测试设置为Host Application : None

我想,框架没有添加到单元测试目标,我是对的。所以我在构建阶段将来自carthage文件夹的XCGLogger.framework添加到Link Binary和Libraries。然后我还在运行脚本中添加了框架

enter image description here

这解决了我遇到的错误,我开始收到新的错误

Ambiguous reference to member 'log'

然后创建一个一次性的初始类XCGLogger解决了它

我在这里创建了一个拉取请求,希望他能合并它......

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

使用单元测试。 [迦太基或手动框架安装后]

确保您的XCGLogger.framework已添加到您的单元测试目标的构建阶段 - >链接二进制文件库。

我还添加了一个运行脚本,以确保从Carthage文件夹中复制框架。

如果您的单元测试的主机应用程序设置为无,并且您的应用程序的类正在使用XCGLogger,您将看到类似

的错误

Ambiguous reference to member 'log' 发生这种情况是因为XCTest逐个运行您的单元测试,并且它无法访问AppDelegate文件中的XCGLogger构造函数。因此,您的一次初始化不存在,并且无法找到正确的引用。

要解决此问题,您需要一次性初始化方法来构建XCGLogger

在测试目标中创建一个新类,确保它名为TestSetup

import XCGLogger

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

    return log
}()


class TestSetup: NSObject {
    override init() {

    }
}

然后转到测试目标信息设置并添加新行Principal class,值将为YourTestTargetName.TestSetup,有关详细信息,请转到How to run one-time setup code before executing any XCTest

这应该可以解决这个问题......