gpt4 book ai didi

xcode - 在 Swift 中使用内联预处理器宏

转载 作者:搜寻专家 更新时间:2023-10-31 22:34:17 25 4
gpt4 key购买 nike

背景:我想用 XCTest 测试私有(private)方法,所以我正在寻找一种优雅的解决方案来将私有(private)方法公开给我的 XCTestCase 类。

免责声明:有些人认为测试类的内部结构是根本错误的。在实践中我不同意,因为当测试失败时,测试私有(private)可以更容易地追踪问题。

Swift private functions是文件私有(private)的,private真正的意思是private,因此没有办法将私有(private)函数暴露给其他文件。使用预处理器宏,私有(private)功能可以通过一个构建配置的公共(public)函数公开。例如,我为我的测试方案使用的测试配置设置了一个 TEST 编译标志。

到目前为止,这是我拥有的最好的解决方案,但它需要为每个需要测试的私有(private)函数提供烦人的样板文件:

在 ClassThatNeedsTesting.swift 中:

class ClassThatNeedsTesting {
#if TEST
func publicAccessToPrivateFunctionThatNeedsTesting() -> Bool {
return self.privateFunctionThatNeedsTesting()
}
#endif

private func privateFunctionThatNeedsTesting() -> Bool {
return true;
}
}

在 TestClass.swift 中:

class TestClass: XCTestCase {
func testExample() {
XCTAssert(ClassThatNeedsTesting().publicAccessToPrivateFunctionThatNeedsTesting());
}
}

但是有没有办法用内联预处理器宏来简化这个呢?这就是我想要的,但它无法编译,因此我要问的原因:

在 ClassThatNeedsTesting.swift 中:

class ClassThatNeedsTesting {
#if TEST private #endif func privateFunctionThatNeedsTesting() -> Bool {
return true;
}
}

在 TestClass.swift 中:

class TestClass: XCTestCase {
func testExample() {
XCTAssert(ClassThatNeedsTesting().privateFunctionThatNeedsTesting());
}
}

如果没有办法做到这一点,也许有更简单的解决方案?

最佳答案

使用 @testable,Swift 2.0 中的新功能:

@testable import MyModule

class TestClass: XCTestCase {
func testExample() {
XCTAssert(ClassThatNeedsTesting().privateFunctionThatNeedsTesting());
}
}

来自 Xcode 7 Release Notes

Testability. With testability, you are now able to write tests of Swift 2.0 frameworks and apps without having to make all of your internal routines public. Use @testable import {ModuleName} in your test source code to make all public and internal routines usable by XCTest targets, but not by other framework and app targets.

是否应该测试私有(private)方法是一个热门话题。参见讨论 here , herehere

关于xcode - 在 Swift 中使用内联预处理器宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33638828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com