GHUnit,OCMock:如何测试是否调用了两个指定块中的一个?

时间:2012-10-31 05:57:43

标签: objective-c ios unit-testing ocmock

我有一个采用响应块和错误块的方法,我通过给出有效数据和无效数据来编写单元测试,因此它将分别调用响应块和错误块,但是使用GHUnit和OCMock,我该如何测试如果调用了正确的块?

我在想:

有效数据: 响应 {     GHAssertTrue(YES,@“”); } 错误 {     GHAssertTrue(NO,@“有效数据不应调用错误块”); }

,反之亦然,无效数据。

我做的是否正确?

2 个答案:

答案 0 :(得分:0)

以下是我要做的事情:

  • 向测试类添加属性以指示调用哪个块
  • 让每个块将该属性设置为不同的值
  • 调用
  • 检查属性的值

答案 1 :(得分:0)

将断言置于块中的问题是您不知道是否都没有调用块。这就是我们的工作:

__block BOOL done = NO;
[classUnderTest doSomethingWithResultBlock:^(BOOL success) {
    done = YES;
} errorBlock:^(BOOL success) {
    // should not be called
    expect(NO).to.beTruthy();
}];
while (!done) [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];

缺点是如果从未调用成功块,则测试将在while循环中挂起。您可以通过添加超时来避免这种情况:

NSDate *startTime = [NSDate date];
__block BOOL done = NO;
[classUnderTest doSomethingWithResultBlock:^(BOOL success) {
    done = YES;
} errorBlock:^(BOOL success) {
    // should not be called
    expect(NO).to.beTruthy();
}];
while (!done && [startTime timeIntervalSinceNow] > -30) [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
// make sure it didn't time out
expect(done).to.beTruthy();