为什么我需要在Swift中为struct编写初始化程序才能在单元测试中使用它?

时间:2014-12-24 10:34:08

标签: ios xcode swift

我正在尝试使用公共结构

public struct Person {
  public let name: String
}

在单元测试中(XCTest):

let person = Person(name: "Paul")

测试版本失败,错误:

  

'Person'无法构造,因为它没有可访问的初始值设定项。

为了构建测试,我需要为struct编写初始化器。感觉不对,因为结构已经有初始化器。有没有人有更好的解决方案?

Xcode版本6.1.1(6A2008a)

2 个答案:

答案 0 :(得分:43)

问题在于,使用结构获得的自动合成初始化程序合成为internal,这意味着无法从另一个模块访问它。

您的单元测试目前在另一个模块中运行,因此无法看到初始化程序。正如Ben-G在他的回答中指出的那样,这是从具有@testable属性的Swift 2.0开始解决的。

这是Swift项目中单元测试普遍破坏的一部分。单元测试模块应具有对app模块的特殊访问权限,否则您必须添加大量的访问控制行李。

来自documentation

  

结构类型的默认成员初始值设定项

     

如果结构的任何存储属性是私有的,则结构类型的默认成员初始值设定项被视为私有。否则,初始化程序的访问级别为内部。

     

与上面的默认初始化程序一样,如果您希望在另一个模块中使用成员初始化程序时可以初始化公共结构类型,则必须自己提供公共成员初始化程序作为类型定义的一部分

答案 1 :(得分:15)

这在Swift 2.0中使用@testable属性修复。

如果您使用@testable将模块导入测试,则合成的初始值设定项将对您的测试可见。

您可以找到@testable here.

的简要介绍