我正在为一个公共方法编写BDD单元测试,该方法更改了一个私有属性(private var),因此我想编写一个expect()并确保它被正确设置。由于它是私有的,我无法从单元测试目标中访问它。
对于Objective-C,我只需添加扩展头即可。在Swift中有类似的技巧吗?请注意,该属性有一个带有一些代码的didSet()。
我正在为一个公共方法编写BDD单元测试,该方法更改了一个私有属性(private var),因此我想编写一个expect()并确保它被正确设置。由于它是私有的,我无法从单元测试目标中访问它。
对于Objective-C,我只需添加扩展头即可。在Swift中有类似的技巧吗?请注意,该属性有一个带有一些代码的didSet()。
@testable
属性,可以使内部方法和属性可用于测试。有关更多信息,请参见@JeremyP的下面评论。@objc
,那么您就可以打破这些优化,并且可以使用ObjC来阅读它。还有一些奇怪的解决方法,可以让您使用Swift调用任意@objc
公开方法(比如零超时NSTimer
)。但别这样做。在待测试的文件中创建一个函数来暴露你想要的东西。不是方法,而是自由函数。然后你可以把这个辅助函数放在 #if TEST
中,并在测试配置中设置 TEST
。理想情况下,我会让这个函数实际测试你关心的东西,而不是暴露变量(在这种情况下,也许你可以让函数成为内部或甚至公共的)。但无论哪种方式都可以。
@testable
不会使私有变量可用于测试,只有内部变量可以。因此,Swift 2并没有让这个问题变得微不足道,这样做是有充分理由的。如果没有办法从外部看到内部状态的影响,那还有谁在乎它是什么呢? - JeremyP