块上下文中的OCMock

时间:2012-10-30 16:46:44

标签: objective-c ios objective-c-blocks ocmock

所以我试图将一个简单的测试放在一起,以验证我是否正确地从audioController接收频率值。

在我看来,我正在打这样的电话来设置一个块回调:

- (void) registerVolumeCallback {
      NSNumberBlock frequencyCallback = ^(NSNumber *frequency) {
          self.currentFrequency = frequency;
      };
      self.audioController.frequencyCallback = frequencyCallback;
  }

在我的音频控制器中,使用包含频率的nsnumber调用频率回调块。

在我的测试文件中,我有以下内容:

    - (void) testFrequencyAudioServiceCallbackActive {
          OCMockObject *mockEqualizer = [OCMockObject partialMockForObject:self.testEqualizer];
          [[[mockEqualizer stub] andCall:@selector(mockDidUpdateFrequency:)
                      onObject:self] setCurrentFrequency:[OCMArg any]];
          [self.testEqualizer startAnimating];
          [ mockEqualizer verify];
    }

   - (void) mockDidUpdateFrequency: (NSNumber *) frequency {
        GHAssertTrue((frequency!= nil), @"Audio Service is messing up");
  }

其中测试均衡器是上述视图的实例。所以我试图在这里做一些调配。问题是,从不调用mockDidUpdateFrequency。我试着把:

 self.currentFrequency = frequency;

在块之外,并且发生了混合,我确实调用了mockDidUpdateFrequency。我也尝试过:

 - (void) registerVolumeCallback {
     __block UIEqualizer *blockSafeSelf = self;
     NSNumberBlock frequencyCallback = ^(NSNumber *frequency) {
       blockSafeSelf.currentFrequency = frequency;
     };
    self.audioController.frequency = frequencyCallback;
}

没有运气。一些奇怪的实例内容正在我不知道的块上下文中进行。有谁知道发生了什么事?

1 个答案:

答案 0 :(得分:0)

您需要提供更多详细信息以获得明确的答案。例如,如何调用registerVolumeCallbackfrequencyCallback是您自己的代码还是第三方API?

根据您提供的内容,我怀疑frequencyCallback是异步调用。因此,即使startAnimating可能创建最终将被调用的条件,您也可以在回调有机会被调用之前立即验证模拟。为了让你的测试按照你想要的那样执行,你需要了解该块执行的队列,你需要给它一个执行的机会。

如果在主队列上异步调用它,可以在调用verify之前让主运行循环旋转:

[self.testEqualizer startAnimating];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]];
[mockEqualizer verify];

如果在不同的队列中调用它,则会有一些不同的选项,但这有助于更清楚地了解代码的结构。