延迟OCMock验证/处理单元测试中的超时

时间:2011-09-05 16:12:04

标签: ios unit-testing asynchronous timeout ocmock

我正在使用OCMock测试真实的Web服务调用。

现在我正在做 之类的事情:

- (void)testWebservice
{
    id mydelegatemock = [OCMockObject mockForProtocol:@protocol(MySUTDelegate)];
    [[mydelegatemock expect] someMethod:[OCMArg any]];

    [SUT sutWithDelegate:mydelegatemock];

    // we need to wait for real result
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];

    [(OCMockObject*)mydelegatemock verify];
}

它工作正常,但这意味着每次这样的测试都需要2秒钟。

有没有办法设置超时时间,例如2秒,然后立即someMethod拨打mydelegatemock的{​​{1}}并完成测试用例?

3 个答案:

答案 0 :(得分:6)

我使用我发现的at this link

的便捷实用功能
#import <Foundation/Foundation.h>
#import <OCMock/OCMock.h>

@interface TestUtils : NSObject
+ (void)waitForVerifiedMock:(OCMockObject *)mock delay:(NSTimeInterval)delay;
@end

实施:

#import "TestUtils.h"
@implementation TestUtils

+ (void)waitForVerifiedMock:(OCMockObject *)inMock delay:(NSTimeInterval)inDelay
{
    NSTimeInterval i = 0;
    while (i < inDelay)
    {
        @try
        {
            [inMock verify];
            return;
        }
        @catch (NSException *e) {}
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
        i+=0.5;
    }
    [inMock verify];
}

@end

这使我可以等到最大延迟(以秒为单位)而无需每次等待全部金额。

答案 1 :(得分:1)

我会从处理Web服务结果的类的单元测试中分离Web服务的功能测试(如果您需要这样做)。

要进行单元测试,您应该模拟Web服务调用,提供模拟结果。然后,您的测试将验证,对于明确定义的结果,您的类的行为相应。

如果您还想对Web服务进行功能测试(假设它在给定请求时返回特定响应),则不需要模拟任何内容 - 只需调用服务并对结果进行断言。 / p>

通过分离测试,您可以更好地控制测试运行。例如,您可以在每次更改代码时运行快速运行的单元测试,但每晚在专用服务器上运行慢速运行的功能测试,或根据需要运行。当测试中断时,您将知道它是您的代码还是Web服务的错误。

答案 2 :(得分:0)

你也可以切换到GHUnit,就像其他成员在回答这个相关问题时建议的那样:

SenTestingKit in Xcode 4: Asynchronous testing?

你可以在这里找到GHUnit

https://github.com/gabriel/gh-unit