Unit testing Swift、访问修改器和单元测试
我刚刚升级到Xcode 6 beta 4,Swift编译器现在支持它 这给我带来了一个问题,因为我的单元测试现在无法编译(因为类不是公共的) 简单的解决方案当然是将所有测试的类公开,但这感觉像是一种黑客行为(我个人的偏好是即使在非公开类上也编写单元测试)Unit testing Swift、访问修改器和单元测试,unit-testing,swift,Unit Testing,Swift,我刚刚升级到Xcode 6 beta 4,Swift编译器现在支持它 这给我带来了一个问题,因为我的单元测试现在无法编译(因为类不是公共的) 简单的解决方案当然是将所有测试的类公开,但这感觉像是一种黑客行为(我个人的偏好是即使在非公开类上也编写单元测试) 在.NET和Java中,通常可以允许单元测试程序集级别(或Java/OSGi中的捆绑包级别)从单元测试程序集访问被测程序集。我不明白如何在Swift中做类似的事情。我真的必须公开所有类才能进行单元测试吗?您只需将源文件从目标添加到测试目标。然后
在.NET和Java中,通常可以允许单元测试程序集级别(或Java/OSGi中的捆绑包级别)从单元测试程序集访问被测程序集。我不明白如何在Swift中做类似的事情。我真的必须公开所有类才能进行单元测试吗?您只需将源文件从目标添加到测试目标。然后它们将成为您测试目标的一部分,您将能够访问它们。这是一个已知的问题,在Beta 4发行说明中提到。在提供更多信息之前,您可能希望推迟更改设计 我们意识到我们的访问控制设计对于单元测试来说不是很好(这在发行说明中),我们正在评估情况,看看我们能做些什么 --克里斯·拉特纳 访问控制系统的一个限制是单元测试不能和应用程序中的类和方法交互,除非它们被标记为公共的。这是因为单元测试目标不是应用程序模块的一部分 --Xcode beta 4发行说明
我想我有一个比公开一切更好的解决方案。只需将故事板作为测试目标的一个成员,就像使用所有ViewController一样。然后使用测试包而不是nil或主包在测试类中创建故事板。检查示例代码
var storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle(forClass: self.dynamicType))
vc = storyboard.instantiateViewControllerWithIdentifier("LoginVC") as LoginViewController
vc.loadView()
使用Swift 2,您现在可以测试您的类,而无需将其标记为公共类。您只需使用关键字
@testable
,编译器将处理其余部分
幻灯片从:
我并不介意,因为通常我只想测试公共API。测试每一门课和每一种方法都是一种浪费。最终这是一个哲学问题,有不同的观点/策略。我不会测试所有的东西,但我会尽量保持我的公共API尽可能小。我更喜欢类似IoC的解决方案,但在这类应用程序中,这感觉完全是过火了。尝试过了,但它们属于另一个模块(测试模块)。因此,测试创建的类的实例不能转换为应用创建的类的实例。@Krumelur如果您使用所有源文件进行转换,这是一个问题吗?好吧,既然这些类是独立的(与ObjC相反),我可以预见很多问题。对我来说,最直接的是CoreData管理类。@Krumelur-hmm,这可能是个问题。好吧,我很务实,我的“内部”API是公开的:)谢谢你的信息!我现在把一切都公之于众,希望在下一个Xcode发行版中能有所改进。。在以后的测试版中,我找不到任何更新。。苹果刚刚发布了一款使单元测试变得困难的产品吗?!我自己也没有听说过这件事。如果他们没有在1.0中解决这个问题,那就太遗憾了。也许他们会在Yosemite的Xcode 6.1版本中使用。