在swift 2

时间:2015-08-26 14:10:57

标签: swift unit-testing swift2 protocol-extension

我发现很难在swift中的结构中存根方法。我现在可以使用我将在下面解释的方式来做到这一点,但我感觉不对,并希望得到一个意见。

我不使用任何第三方库进行存根,而是更喜欢覆盖我需要更改其结果的特定方法。在swift之前,我总是会使用类 - 所以很容易子类化并覆盖我在单元测试用例中需要模拟的方法。

现在我的大部分构造都是结构体,因为它们实际上不需要是引用类型。但是我不能在我的测试用例中覆盖任何方法。我目前正在使用如下所述的协议扩展 -

protocol AProtocol {
  func a()
  func b() // This calls a()
}

extension AProtocol {
  func a(){
     //Default implementation of a()
  }
  func b(){
     //Default implementation of b() which also calls a()
  }
}

struct A:AProtocol {
  // Empty. struct A will be used by other classes/structs in the code
}

在我的测试用例中

struct TestA:AProtocol {
   func a() {
      Some mock implementation of a() so that b() can be tested
   }
}

所以我的问题是 - 没有必要通过协议实现struct A.其他类或结构都不会实现AProtocol。但这是我可以模拟其单元测试方法的唯一方法。我认为关于协议扩展的WWDC会议也展示了这种单元测试方式,但基本上我不需要我的struct作为协议的实现。

在swift中是否有任何其他方法来存根结构方法(不使用任何第三方库)?或者是测试结构方法的更好方法。

1 个答案:

答案 0 :(得分:1)

我将成为那个没有回答问题的人,并探讨你是否真的需要做你所说的我害怕的事情。

我的问题是你是否真的需要模拟结构。对于非变异函数,设置结构并测试返回值。对于变异函数,检查之后的状态是否符合预期。

对于结构,通常不应该有修改之外的副作用,因此不需要准确跟踪其他函数的调用。

可能足够接近答案的位稍微有用:

如果你真的在结构之外做副作用,我会建议你制作效果正在进行或注射的对象,这样只需要一个额外的测试,你可以注入一个替代的模拟对象来接收副作用叫。