首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在swift 3的测试目标中使用XCGLogger?

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

Stack Overflow用户
提问于 2016-12-18 01:58:19
回答 1查看 413关注 0票数 2

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

下面是我的AppDelegate类文件的一部分。这会创建一个全局变量log,例如,只需调用log?.info("foo"),我就可以在应用程序中的任何地方使用它。

在迁移到swift 3之前,这在测试目标中也是有效的,但现在如果我尝试在测试目标中使用log?.info("foo"),我会得到一个链接错误。

AppDelegate代码

代码语言:javascript
复制
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 {
 ...
}

测试目标中的类

代码语言:javascript
复制
import XCTest
@testable import OurLatitude

class ApiAccessTests: XCTestCase {

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

}

链接错误

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 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

代码语言:javascript
复制
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

这应该能解决这个问题……

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41201465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档