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

7

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

目前,我正在做类似于某件事情

- (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秒的超时时间,并让对mydelegatemocksomeMethod的调用立即进行verify并完成测试用例?

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

这使我能够等待最长延迟时间(以秒为单位),而无需每次都等待完整的时间。


2
也许起源于这里?... http://touchalicious.com/blog/2009/11/5/asynchronous-unit-testing-with-ocmock.html - Max MacLeod
1
谢谢Max - 那看起来就是源代码。我已经更新了原始回复,并附上了原始链接。 - Tim Dean

1

如果需要进行Web服务的功能测试,我会将其与处理Web服务结果的类的单元测试分开。

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

如果您还想对Web服务进行功能测试(例如,它返回特定响应给定某些请求),则不需要模拟任何内容-只需调用服务并对结果进行断言即可。

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


2
我已经有了使用虚假返回的预设测试,这些测试是从网络服务中获取的。这个问题是关于使用真实网络服务进行集成测试的。我承认在这些测试中可以将应用程序部分放在一边,但这并不改变我需要以某种方式等待结果的事实。而且:使用预设结果,我无法测试请求和结果之间的延迟,因为使用预设结果时,结果委托实际上是在请求调用完成之前被调用的。 - fabb

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接