如何为仅在测试中可见的结构创建 init 方法?

Posted

技术标签:

【中文标题】如何为仅在测试中可见的结构创建 init 方法?【英文标题】:How do I create an init method for a struct which is only visible in tests? 【发布时间】:2015-02-18 10:17:46 【问题描述】:

我想为我的结构创建一个 init 方法,其中包含一组用于单元测试的默认值。我不希望主模块能够看到这个 init 方法。

我以为我可以简单地在我的测试类的文件中创建我的结构的扩展,但这不起作用:

Foo.swift(在应用程序目标中):

public struct Foo 

    public let bar: Int

    public init(colour: String) 
        self.bar = colour == "Green" ? 0 : 1
    


FooExtension.swift(在测试目标中):

extension Foo 

    public init(bar: Int = 42) 
        self.bar = bar
    


请注意主文件中的非默认初始化程序,因此 Swift 编译器不会自动为我创建成员初始化程序。也许这与问题有关,也许不是。

Swift 编译器抱怨Cannot assign to 'bar' in 'self'。但是,当我将该 init 方法复制到我的主要目标中 Foo 结构的原始定义中时,它可以正常工作。无论是否使用默认参数值,我都会得到相同的结果。

这是 Swift 编译器错误还是与在一个模块中为另一个模块中定义的结构定义扩展有关?当我尝试在 Playground 中复制它时,一切正常。

我正在使用带有 Xcode 版本 6.4 (6E35b) 的 Swift 1.2

【问题讨论】:

如果属性声明为public var,但不是public let,它可以工作。对我来说它看起来像一个错误。 啊,好点子,我没有具体说明——它旨在成为一个不可变结构,所有属性都是let @RobertAtkins:你能把你的代码放在这里吗?我刚刚尝试过类似的事情(在主应用程序中参数化init(...) 并使用init() 扩展类型,在测试类中将预定义值分配给let-properties)并且效果很好。 【参考方案1】:

我已经对我提交的雷达做出了回应;我现在要求的是explicitly disallowed。

【讨论】:

以上是关于如何为仅在测试中可见的结构创建 init 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何为返回列表的方法创建适当的单元测试?

如何为我在 Swift 中以编程方式创建的 UIViewController 子类创建 init?

如何为 ListView 的 ContextActions 的 MenuItem 添加可见性绑定

如何为开发人员创建亚马逊沙盒帐户?

iPhone OS:如何为特定日期创建 NSDate?

如何为uitableview的所有行和所有部分创建索引路径?