我正在使用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}}并完成测试用例?
答案 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)