【问题标题】:Delayed OCMock verify / Dealing with Timeout in Unit Tests延迟 OCMock 验证/处理单元测试中的超时
【发布时间】:2011-11-10 17:57:36
【问题描述】:

我正在使用 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秒,然后让mydelegatemocksomeMethod立即verify调用并完成测试用例?

【问题讨论】:

    标签: ios unit-testing asynchronous timeout ocmock


    【解决方案1】:

    我使用我发现的一个方便的实用函数来做到这一点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
    

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

    【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我已经有来自网络服务的即时虚假回报的罐头测试。这个问题是关于与真实 Web 服务的集成测试。我承认我可以将应用程序部分放在一边,但这并没有改变我需要以某种方式等待结果的事实。并且:对于预设结果,我不会测试请求和结果之间是否存在延迟,与预设结果一样,结果委托实际上是在 请求调用完成之前调用的。
    【解决方案3】:

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

    SenTestingKit in Xcode 4: Asynchronous testing?

    你可以在这里找到 GHUnit

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 2014-10-24
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多