小编Ric*_*hin的帖子

编写单元测试以验证NSTimer已启动

我正在使用XCTestOCMock编写iOS应用程序的单元测试,我需要指导如何最好地设计单元测试,以验证方法是否导致NSTimer启动.

被测代码:

- (void)start {
    ...
    self.timer = [NSTimer timerWithTimeInterval:1.0
                                         target:self
                                       selector:@selector(tick:)
                                       userInfo:nil
                                        repeats:YES];
    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
    [runLoop addTimer:self.timer forMode:NSDefaultRunLoopMode];
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想测试的是使用正确的参数创建计时器,并计划在运行循环上运行计时器.

我想到了以下我不满意的选择:

  1. 实际上等待计时器开火.(原因我不喜欢它:可怕的单元测试练习.它更像是一个缓慢的集成测试.)
  2. 将计时器启动代码提取到私有方法中,将类扩展文件中的私有方法暴露给单元测试,并使用模拟期望来验证私有方法是否被调用.(原因我不喜欢它:它验证方法被调用,但不是该方法实际上设置定时器才能正确运行.另外,暴露私有方法不是一个好习惯.)
  3. NSTimer被测代码提供模拟.(原因我不喜欢它:无法验证它实际上是否已安排运行,因为定时器是通过运行循环NSTimer启动的,而不是来自某些启动方法.)
  4. 提供模拟NSRunLoop并验证addTimer:forMode:被调用.(原因我不喜欢它:我必须在运行循环中提供一个接口?这看起来很古怪.)

有人可以提供一些单元测试指导吗?

unit-testing objective-c nstimer ios

10
推荐指数
1
解决办法
3487
查看次数

标签 统计

ios ×1

nstimer ×1

objective-c ×1

unit-testing ×1