6

我正在使用 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 秒的超时,并立即调用someMethodmydelegatemock完成verify测试用例?

4

3 回答 3

7

我使用在此链接中找到的一个方便的实用程序函数来执行此操作:

#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

这使我可以等待最大延迟(以秒为单位),而无需每次都等待全部时间。

于 2011-09-06T02:21:45.807 回答
1

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

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

如果您还想对您的 Web 服务进行功能测试(假设它返回给定某个请求的特定响应),您不需要模拟任何东西——只需调用该服务并对结果进行断言。

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

于 2011-09-06T07:01:06.480 回答
0

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

SenTestingKit in Xcode 4: Asynchronous testing?

You can find GHUnit here

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

于 2012-05-10T12:24:12.900 回答