如何在项目中测试私有或fileprivate函数

时间:2018-04-26 10:08:03

标签: ios swift unit-testing

我想为经理类编写一些单元测试代码,我要编写的函数是使用一些小的private函数。如果我测试public函数,我会做很多准备,所以我想测试那些private函数。但是在测试目标中我无法直接调用私有函数。

所以我想问一下,有没有办法测试它们而不将它们从private改为internalpublic

4 个答案:

答案 0 :(得分:2)

  

所以我想问一下,有没有办法测试它们而不将它们从私人更改为internalpublic

添加一个除了调用私有函数之外什么都不做的内部函数。可能最好在扩展中执行此操作:

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()
   }
}