我想为经理类编写一些单元测试代码,我要编写的函数是使用一些小的private
函数。如果我测试public
函数,我会做很多准备,所以我想测试那些private
函数。但是在测试目标中我无法直接调用私有函数。
所以我想问一下,有没有办法测试它们而不将它们从private
改为internal
或public
?
答案 0 :(得分:2)
所以我想问一下,有没有办法测试它们而不将它们从私人更改为
internal
或public
?
添加一个除了调用私有函数之外什么都不做的内部函数。可能最好在扩展中执行此操作:
class Foo
{
fileprivate func myPrivateFunction(p: Int) { ... }
}
extension Foo
{
internal func testMyPrivateFunction(p: Int)
{
myPrivateFunc(p: p)
}
}
您可能会找到一种使用条件编译来省略发布版本扩展的方法,例如
#if DEBUG
extension Foo
{
internal func testMyPrivateFunction(p: Int)
{
myPrivateFunc(p: p)
}
}
#endif
没有测试有条件的东西,看它是否有效,它是从这里借来的https://ericasadun.com/2018/04/18/forcing-compiler-errors-in-swift/
答案 1 :(得分:1)
可悲的是没有。没有" VisibleForTesting" swift中的标记,就像在java中一样。
但是,您可以定义经理类实现的协议,包括您要测试的方法。
例如,如果你的经理有一个名为createViewModel的函数,它调用了几个私有方法,测试所创建的viewModel与我们所期望的那些,我们已经隐式测试了私有方法的工作。您可以使用不同的初始条件设置您的经理,以测试所有品种和边缘案例
答案 2 :(得分:1)
我认为您正在寻找 var checkValidDate = function(date) {
date = moment(date).format('DD-MM-YYYY');//assuming the parameter date is a Date type object
if (date > minDate || date < dueDate) return date;
return null;
}
次导入。来自Apple的文档:
将
@testable
属性添加到导入语句中时 在启用测试的情况下编译的模块,您激活提升的访问 对于该范围内的该模块。标记为的类和类成员 内部或公共行为就好像被标记为开放一样。其他实体 标记为内部行为,好像他们被宣布为公开。
答案 3 :(得分:0)
接口是解决方案。
此解决方案比其他解决方案复杂一些,但可以帮助您实现多种用途,例如在您的应用上解耦模块。
我们假设您有一个类Foo
,其类型为Bar
,您需要拨打doStuff()
。
为Bar创建协议。因此,Foo与Bar分离,并且在不将其内容暴露给Foo的情况下变得完全可测试。像这样:
protocol BarProtocol {
func doStuff()
}
class Bar:BarProtocol {
func doStuff() {
print("Hello world")
}
}
class Foo {
var bar:BarProtocol
init() {
self.bar = Bar()
self.bar.doStuff()
}
}