如何在Swift中模拟单个函数?

时间:2015-04-02 18:28:04

标签: unit-testing swift mocking

我的问题很简单,如何在Swift中模拟函数(不是方法)。 即一个不在课堂内的独立功能。

谢谢。

编辑:

我们说我有以下功能:

func distance(c1: CLLocation, c2: CLLocation) {
    ...
}

我想测试我的课程:

class MyClass {

    func selectedLocation(location: CLLocation) {
        let text = "\(distance(self.currentLocation, location)) meters"

        self.view.showText(text)
    }

}

如何模拟distance功能?

2 个答案:

答案 0 :(得分:1)

要模拟距离函数,您需要执行类似这样的操作

func distance(c1: CLLocation, c2: CLLocation) -> CLLocationDistance {
  // ...
}

class MyClass {
  var calculateDistance = distance

  func selectedLocation(location: CLLocation) {
    let text = "\(calculateDistance(self.currentLocation, location)) meters"

    self.view.showText(text)
  }

}

在您的测试代码中,您需要执行此操作:

func testCalculateDistanceFromLocation() {
  let thing = MyClass()
  thing.calculateDistance = { c1, c2 in /* return mock distance here */ }

  // assert correct text appeared in the view
}

这样,您就可以在测试环境中提供距离函数的新实现。据我所知,你无法动态地完全替换顶级函数的主体,因此你不需要存储该函数值的内部类属性。

虽然为你的所有功能都这样做很麻烦,所以我说只有当你觉得你绝对需要替换这个额外的模拟依赖时才这样做。如果可能的话,我建议你把你的类测试为wnole单元,如果它有很少或没有其他外部依赖,并将距离函数视为实现细节。

答案 1 :(得分:0)

不知道我是否明白这一点。 Swift确实支持全局功能。

[update: This is what I do in the unit test]

    public func getNumber()->Int //add public for unit testing
    {
        return 1
    }

    class MyClass: NSObject
    {
        func calculate()
        {
            let num = getNumber()
            println(num)
        }
    }

///unit test case
    import MyModule

    extension NSObject
    {
         public fund getNumber()->Int
         {
             return 5 //mock implementation
         }
    }


    func testExample() {

        let myInstance = MyClass()
        myInstance.calculate()

    }