我使用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)发布于 2017-03-28 05:01:47
我使用Carthage,我的单元测试设置是Host Application : None。
我想,框架没有被添加到单元测试目标中,我是对的。因此,我在构建阶段添加了来自迦太基文件夹的XCGLogger.framework来链接二进制文件和库。然后,我还将框架添加到运行脚本中

这解决了我得到的错误,并且我开始得到一个新的错误
Ambiguous reference to member 'log'
然后创建一个一次性类来初始化XCGLogger解决了这个问题
我已经在这里创建了一个拉取请求,希望他会合并它....
https://github.com/DaveWoodCom/XCGLogger/pull/188/files
使用单元测试。在Carthage或手动安装框架之后
确保您的XCGLogger.framework已添加到单元测试目标的构建阶段->链接二进制文件和库。
我还添加了一个运行脚本,以确保框架是从Carthage文件夹复制的。
如果您的单元测试的宿主应用程序设置为None,并且您的应用程序的类正在使用XCGLogger,您将看到如下错误
Ambiguous reference to member 'log'这是因为XCTest一个接一个地运行你的单元测试,并且它不能访问你AppDelegate文件中的XCGLogger构造函数。因此,您的一次性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,有关详细信息,请转到How to run one-time setup code before executing any XCTest

这应该能解决这个问题……
https://stackoverflow.com/questions/41201465
复制相似问题