我刚刚升级到Xcode 6 beta 4,Swift编译器现在支持access modifiers。
这给我带来了一个问题,因为我的单元测试现在无法编译(由于这些类没有公开)。
简单的解决方案当然是将所有测试类公开,但这感觉就像一个黑客(我个人的偏好是甚至在非公开的类上编写单元测试)。
在.NET和Java中,您通常可以允许单元测试程序集级别(或Java / OSGi中的bundle级别)从单元测试程序集访问受测试的程序集。我不明白如何在Swift中做类似的事情。我是否真的必须将我的所有课程公开进行单元测试?
答案 0 :(得分:10)
这是一个已知问题,在Beta 4发行说明中提到过。您可能希望暂停更改设计,直到提供更多信息。
我们知道我们的访问控制设计对于单元测试来说并不是很好(这在发行说明中),我们正在评估情况,看看我们能做些什么。
- Chris Lattner
访问控制系统的一个限制是单元测试不能与应用程序中的类和方法交互,除非它们被标记为公共。这是因为单元测试目标不是应用程序模块的一部分。
- Xcode beta 4发行说明
https://github.com/ksm/SwiftInFlux#limitations-of-current-access-control-design
答案 1 :(得分:10)
使用Swift 2,您现在可以测试您的课程,而无需将其标记为公开。您只需使用关键字Console.WriteLine((decimal)8.3 - 8);
Console.WriteLine((decimal)8.2 - 8);
Console.WriteLine((decimal)7.2 - 7);
,编译器将负责休息。
答案 2 :(得分:1)
您只需将目标中的源文件添加到测试目标即可。然后他们将成为您的测试目标的一部分,您将能够访问它们。
答案 3 :(得分:0)
我认为我有一个更好的解决方案,而不是公开一切。只需将StoryBoard作为测试目标的一员,就像使用所有ViewControllers一样。然后使用测试包而不是使用nil或主包在测试类中创建StoryBoard。检查my post here以获取示例代码。
var storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: NSBundle(forClass: self.dynamicType))
vc = storyboard.instantiateViewControllerWithIdentifier("LoginVC") as LoginViewController
vc.loadView()