测试在私有变量中保留其状态的类

2024-04-28

我正在为我的班级编写单元测试。此类在某些情况下保留其状态private变量(我不想公开暴露)。所以场景是:

  • 如果我调用一个方法,第一次它会保持该状态private属性并调用委托方法并返回一些结果。
  • 当我第二次调用相同的方法时,输出将根据之前的输入而有所不同。

我想在我的测试中涵盖所有情况。

  • 一种简单的方法是将我的私有属性更改为公共属性,以便我可以在单元测试中模拟以前的输入。
  • 另一种方法是在同一个测试中使用不同的输入调用同一方法两次。第一次调用将保留状态,下一次调用将是实际测试。

但这两种方式对我来说似乎都很尴尬,而且我不确定哪一种是最好的。 为此类编写单元测试的最佳方法是什么?

protocol ZoneUpdateDetectorOutput: class {
    func updateZoneState(_ state: ZoneState)
}

class ZoneUpdateDetector {
    var zoneChangeTimer: TimerProtocol?
    weak var delegate: ZoneUpdateDetectorOutput?

    private var previousZoneState: ZoneState?
    private var expectedZoneState: ZoneState?

    private func updateZoneState() {
        // If `expectedZoneState` is not equal to `previousZoneState` then `delegate` will be called
        // Otherwise it will just skip
        if expectedZoneState != previousZoneState {
            delegate?.updateZoneState(expectedZoneState!)
            previousZoneState = expectedZoneState
        }
    }

    private func runNotifyZoneStateTimer() {
        guard zoneChangeTimer?.isValid() == false else {
            return
        }
        zoneChangeTimer?.start(timeInterval: 5,
                               onFire: { [weak self] in
                                guard let strongSelf = self else {
                                    return
                                }
                                // On timer fire, it will try to update the state
                                strongSelf.updateZoneState()
        })
    }

    // When zone changes, this method is invoked
    // I basically want to test this method
    func zoneStateChanged(_ state: ZoneState) {
        expectedZoneState = state
        if state != .inZone {
            runNotifyZoneStateTimer()
        } else {
            zoneChangeTimer?.stop()
        }
    }
}

你永远不应该测试内部状态;您应该只测试外部(公开)可见的行为。这样,您就可以更改类的实现细节,而不会破坏任何契约,因此也不会破坏任何测试。

所以第二个选项是首选。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试在私有变量中保留其状态的类 的相关文章

  • 如何以编程方式创建 Spring 上下文?

    有谁知道是否有任何方法可以以编程方式创建 bean 上下文 我希望能够做类似的事情 ConfigurableApplicationContext c new ConfigurableApplicationContext BeanDefini
  • 我可以对图像进行动画处理吗 iOS8 LaunchScreen.xib

    问题 有没有方法可以为针对 iOS 8 1 部署的 Xcode 6 项目的 LaunchScreen xib 文件中的任何内容设置动画 Context 我正在寻找制作简单的动画来传达活动或在用户等待时分散他们的注意力 例子 加载栏 活动指示
  • 如果任何单元测试失败,如何使 Python 的覆盖率工具失败?

    我想使用 shell 脚本来确保我的单元测试通过and我的代码有足够的测试覆盖率 我只想运行我的测试代码once 我希望我可以通过coverage https coverage readthedocs io 工具和单次运行的工具 如果一项或
  • NSRange 到 Range

    我怎样才能转换NSRange to Range
  • 在 swift 中从本地视频创建缩略图

    如何从本地视频文件快速创建缩略图 例如 如果视频文件路径位于此处 file Users Dev Library Developer CoreSimulator Devices F33222DF D8F0 448B A127 C5B03C64
  • Swift - 停止 avaudioplayer

    我正在尝试将音板构建到应用程序中 并找到了一种使用标签来控制播放声音的有效方法 不过 我现在正在尝试集成一个可以与 stop 方法上的AVAudioPlayer但是我当前的代码出现错误 EXC BAD ACCESS 这就是我现在正在使用的
  • 单元测试内存泄漏

    我有一个应用程序存在大量内存泄漏 例如 如果打开一个视图并关闭它 10 次 我的内存消耗会增加 因为视图没有完全清理 这些是我的内存泄漏 从测试驱动的角度来看 我想编写一个测试来证明我的泄漏 并 在修复泄漏之后 断言我修复了它 这样我的代码
  • 数组的扩展,其中元素是可选的

    我有一个数组String like so var myArray String 2 banana nil 31 我还有另一个数组String像这样 var myStringArray String 2 3 我为 Array 编写了一个扩展
  • 使用 FFT 执行音频分析

    我已经被这个问题困扰好几天了 并且浏览了几乎所有相关的 StackOverflow 页面 通过这次活动 我现在对 FFT 是什么及其工作原理有了更深入的了解 尽管如此 我在将其实现到我的应用程序中时遇到了极大的困难 简而言之 我想做的是为我
  • iOS 视频压缩 Swift iOS 8 损坏的视频文件

    我正在尝试压缩用户相机从 UIImagePickerController 拍摄的视频 不是现有视频 而是动态视频 以上传到我的服务器 并花费少量时间来完成此操作 因此较小的尺寸是理想的选择 而不是 30 较新质量的相机为 45 mb 这是在
  • Xcode 6.4 Swift 单元测试无法编译:“GPUImage.h 未找到”“无法导入桥接标头”

    我的 Xcode 项目构建并运行良好 它有 Swift 和 Objective C 代码 它已安装 GPUImage 我向它添加了单元测试 现在它将不再编译 找不到 GPUImage h 文件 导入桥接标头失败 以下是我发现并尝试过的解决方
  • 如何读取 Xcode 6.1 Instruments .trace 文件?

    我一直在尝试阅读 trace文件 我使用生成的custom仪器模板 仪器 自动机 分配 Leaks using 仪器 https developer apple com library mac documentation Developer
  • 如何使用存储在 Cocoa Touch 框架中的 Localized.strings?

    我想为 CocoaTouch 框架添加多语言支持 问题 可本地化的字符串我创建的文件仅被使用NSLocalizedString当它是主应用程序及其目标的一部分时 我想将其存储在框架内以将事物分开 我怎样才能使用可本地化的字符串当放置在 Co
  • 具有透明背景的 Swift 模态视图控制器 [重复]

    这个问题在这里已经有答案了 我知道这个话题很受欢迎 但我在编程语言中遇到了一些问题 事实是我仍然不明白我把代码放在哪里 好吧 我就来说说整个案子 我正在尝试制作一个与正常情况稍有不同的模态 Swift 通过单击按钮 ViewControll
  • 如何在 swift 中以编程方式使用坐标打开地图应用程序?

    我想在地图应用程序中打开纬度和经度 我尝试了这段代码HERE https stackoverflow com questions 12504294 programmatically open maps app in ios 6 func g
  • 当标题中包含“&”时,电子邮件标题无法正确显示,如何在 JavaScript 中修复?

    我有一些代码以以下格式显示文章标题列表 简短描述和作者姓名 标题 作者姓名 描述 作者的姓名和描述与此处无关 因为它们始终显示正确 大多数标题也可以正确显示 以下是一些虚构的示例 关于银行业务您需要了解的最重要的一件事 作者姓名 正确显示
  • Swift - 将图像插入 PDF 不再适用于 iOS 13

    目前正在开发在我的贷款计算器应用程序上导出 PDF 的功能 我有一个预览屏幕 可以在您保存 PDF 之前显示它 预览屏幕由带有 html 的 webView 组成 其中包含占位符 我能够成功地将图像插入到正确的占位符上 并将其显示在 PDF
  • CIAdditionCompositing 给出不正确的效果

    我正在尝试通过平均其他几个图像来创建图像 为了实现这一点 我首先将每个图像变暗 其系数等于我平均的图像数量 func darkenImage by multiplier CGFloat gt CIImage let divImage CII
  • 未捕获的 Kotlin 异常:kotlin.native.In CorrectDereferenceException:非法尝试访问非共享

    我尝试使用 Kotlin MPP Multiplatform 开发 Android 和 iOS 之间的共享库 但我面临着 iOS 中线程的问题 对于我在 iOS 中的应用程序 我在主线程中建立了对象 但它可能调用其他线程中的函数并抛出此异常
  • Swift 中的 quitFirstResponder

    我怎样才能用Apple的新语言实现它 Objective C 代码 void touchesBegan NSSet touches withEvent UIEvent event for UIView view in self view s

随机推荐