【问题标题】:Stubbing methods for unit testing in swift 2swift 2中单元测试的存根方法
【发布时间】:2015-08-26 14:10:57
【问题描述】:

我发现很难在 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 会议也展示了这种单元测试方式,但基本上我不需要我的结构作为协议的实现。

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

【问题讨论】:

    标签: swift unit-testing swift2 protocol-extension


    【解决方案1】:

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

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

    对于结构,除了修改之外通常不会产生副作用,因此无需准确跟踪调用了哪些其他函数。

    可能与答案足够接近以提供一些帮助的位:

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

    【讨论】:

    • 结构体具有非变异函数。考虑 a() 返回一个 ServiceProvider 实例。 b() 使用此实例来放置后端请求。现在我不希望 b() 在我的单元测试中实际使用 ServiceProvider 实例。相反,我希望覆盖 a() 以提供一个模拟实例,该实例只能提供预设响应
    • 在向我指出差异后将“mock”更改为“stub”
    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 2019-07-29
    相关资源
    最近更新 更多