如何在ARC中的OCMock中模拟**参数

时间:2013-08-17 05:31:15

标签: ios objective-c ocmock

我方法的一个参数是**错误,我的项目处于ARC模式。当为此方法编写存根以调用模拟方法时,我将参数设置为以下可能的值。它可能导致编译错误或无法匹配参数来调用mock方法。

  1. OCMOCK_ANY
  2. [OCMArg anyPointer]
  3. 创建了一个NSError对象错误,并说[OCMArg setTo:error]。
  4. 没有任何作用。

    如何模仿这种方法?请指教。

    修改

    -(id)init{
    
        self = [super init];
    
        if (self) {
            id wcm = [OCMockObject partialMockForObject:self];
            [[[wcm stub] andCall:@selector(mockGetWakeupCallsForRoomNumber:error:)    onObject:self] getWakeupCallsForRoomNumber:OCMOCK_ANY error:((NSError __autoreleasing **)    [OCMArg anyPointer])];
            //[[[wcm stub] andCall:@selector(testMockMethod) onObject:self] testMethod];
    
        }
        return self;
    
    }
    
    -(void)testMethod
    {
        NSLog(@"Original");
    }
    
    -(void)testMockMethod
    {
        NSLog(@"Mock");
    }
    -(NSArray*)mockGetWakeupCallsForRoomNumber:(NSString*)roomNumber error:(NSError**)error
    {
        @throw @"Mock method called";
    }
    
    -(NSArray*)getWakeupCallsForRoomNumber:(NSString*)roomNumber error:(NSError**)error
    {
    }
    

    模拟testMockMethod有效。

2 个答案:

答案 0 :(得分:20)

如果您投射它,可以使用setTo:anyPointer

[[[mockFoo expect] andReturn:nil] someMethodWithError:((NSError __autoreleasing **)[OCMArg anyPointer])];

或:

NSError *error;
[[[mockFoo expect] andReturn:nil] someMethodWithError:((NSError __autoreleasing **)[OCMArg setTo:error])];

这是一个通过您发布的方法传递的测试用例:

@interface Foo : NSObject{}

-(NSArray*)mockGetWakeupCallsForRoomNumber:(NSString*)roomNumber error:(NSError**)error;
-(NSArray*)getWakeupCallsForRoomNumber:(NSString*)roomNumber error:(NSError**)error;

@end

@implementation Foo

-(NSArray*)mockGetWakeupCallsForRoomNumber:(NSString*)roomNumber error:(NSError**)error
{
    return @[@"bar"];
}

-(NSArray*)getWakeupCallsForRoomNumber:(NSString*)roomNumber error:(NSError**)error
{
    return nil;
}

@end

@interface SomeTest : SenTestCase {}
@end

@implementation SomeTest

-(void)testMethod
{
    Foo *foo = [Foo new];
    id wcm = [OCMockObject partialMockForObject:foo];
    [[[wcm stub] andCall:@selector(mockGetWakeupCallsForRoomNumber:error:) onObject:foo] getWakeupCallsForRoomNumber:OCMOCK_ANY error:((id __autoreleasing *)[OCMArg anyPointer])];
    NSError *error;
    NSArray *calls = [wcm getWakeupCallsForRoomNumber:@"foo" error:&error];
    STAssertEquals(calls[0], @"bar", @"should match");
}

@end

答案 1 :(得分:2)

最后这就是我实施的内容。

[
 [[wcm stub] 
           andCall:@selector(getWakeupCallsForRoomNumber:error:serverMessage:) 
   onObject:self]
   getWakeupCallsForRoomNumber:OCMOCK_ANY
                         error:((NSError *__autoreleasing *)[OCMArg anyPointer]) 
                 serverMessage:((NSString *__autoreleasing *)[OCMArg anyPointer])];