所以我试图将一个简单的测试放在一起,以验证我是否正确地从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;
}
没有运气。一些奇怪的实例内容正在我不知道的块上下文中进行。有谁知道发生了什么事?
答案 0 :(得分:0)
您需要提供更多详细信息以获得明确的答案。例如,如何调用registerVolumeCallback
? frequencyCallback
是您自己的代码还是第三方API?
根据您提供的内容,我怀疑frequencyCallback
是异步调用。因此,即使startAnimating
可能创建最终将被调用的条件,您也可以在回调有机会被调用之前立即验证模拟。为了让你的测试按照你想要的那样执行,你需要了解该块执行的队列,你需要给它一个执行的机会。
如果在主队列上异步调用它,可以在调用verify
之前让主运行循环旋转:
[self.testEqualizer startAnimating];
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:.1]];
[mockEqualizer verify];
如果在不同的队列中调用它,则会有一些不同的选项,但这有助于更清楚地了解代码的结构。