0

我发现很难在 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
   }
}

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

有没有其他方法可以快速存根结构方法(不使用任何第三方库)?或者更好的方法来测试结构的方法。

4

1 回答 1

1

我将成为不回答问题并探索您是否真的需要做您所要求的事情的人,恐怕。

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

对于结构,通常不应该有超出修改的副作用,因此无需准确跟踪调用了哪些其他函数。

可能足够接近答案的位可能会有所帮助:

如果你真的在结构之外做一些有副作用的事情,我建议你制作效果正在执行的对象或可注入的对象,以便通过额外的测试只初始化你可以注入一个替代的模拟对象来接收副作用来电。

于 2015-08-26T20:49:02.197 回答