我有一个采用响应块和错误块的方法,我通过为其提供有效数据和无效数据来编写单元测试,因此它将分别调用响应块和错误块,但是使用 GHUnit 和 OCMock,我如何测试是否正确块叫什么?
我刚在想:
对于有效数据:响应 { GHAssertTrue(YES, @""); } error { GHAssertTrue(NO, @"有效数据不应调用错误块"); }
无效数据反之亦然。
我做的对吗?
我有一个采用响应块和错误块的方法,我通过为其提供有效数据和无效数据来编写单元测试,因此它将分别调用响应块和错误块,但是使用 GHUnit 和 OCMock,我如何测试是否正确块叫什么?
我刚在想:
对于有效数据:响应 { GHAssertTrue(YES, @""); } error { GHAssertTrue(NO, @"有效数据不应调用错误块"); }
无效数据反之亦然。
我做的对吗?
这就是我要做的:
将断言放入块中的问题在于,您不知道是否没有调用任何块。这就是我们所做的:
__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();