【问题标题】:How to mock #available with Swift?如何用 Swift 模拟#available?
【发布时间】:2017-09-05 09:47:04
【问题描述】:

我有一个 Swift 类,它只为 iOS 11 计算一些东西。这意味着我有以下检查:

if #available(iOS 11, *) {
    //do magic
}

我想知道如何模拟#available 进行单元测试。我想测试一下:

  1. 如果使用正确的参数调用#available
  2. if 语句中的代码。为此,我希望有一种方法可以强制执行if #available(iOS 11, *) 语句的结果。

更新:

由于遇到这些困难,我改变了态度并搬到了:

let result = device.systemVersion.compare("11", options: .numeric)
return result == .orderedSame || result == .orderedDescending

非常感谢任何问题的答案!

【问题讨论】:

  • 嘿@DávidPásztor,谢谢你的文章。也许我误解了这篇文章,但是用这种方法我无法测试我的两点,不是吗?我的 SUT 包含该 if 语句。即使我使用策略设计模式,我仍然无法测试我提到的两点。如果我错了,请随时添加答案。
  • 如果我正确理解了文章中的最后一个提示,为特定 iOS 版本设置构建目标应该可以让您在测试中执行 #available 语句。不过我还没有测试过,所以不能保证它的正确性。
  • 以上有什么更新吗?我也面临同样的问题。
  • 嗨@Shyam,我不得不改变方法:stackoverflow.com/a/46511901/5109911

标签: swift unit-testing mocking


【解决方案1】:

您可以将检查移至如下函数:

func isAvailable() -> Bool {
    if #available(iOS 11, *) {
        return true
    }
    else {
        return false
    }
}

然后在生产代码中包含这个函数,但在测试中模拟它。

此外,如果需要,您可以向该函数添加参数。

【讨论】:

  • 感谢您的回答。使用这种方法,我将无法测试是否在生产中调用了 #available。我需要模拟 #available 函数本身。不幸的是,我并不幸运。
【解决方案2】:

由于遇到这些困难,我改变了态度并搬到了:

let result = device.systemVersion.compare("11", options: .numeric)
return result == .orderedSame || result == .orderedDescending

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    相关资源
    最近更新 更多