0

所以我试图组合一个简单的测试来验证我是否正确地从我的音频控制器接收频率值。

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

- (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;
}

没运气。在我不知道的块上下文中,这里发生了一些奇怪的实例。有谁知道发生了什么?

4

1 回答 1

0

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

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

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

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

如果在不同的队列上调用它,您有一些不同的选择,但它有助于更​​清楚地了解您的代码首先是如何构造的。

于 2012-10-31T05:21:46.110 回答