2013-08-17 23 views
13

我的方法的一個參數是**錯誤,我的項目處於ARC模式。當爲這個方法寫存根以調用一個模擬方法時,我將參數設置爲低於可能的值。它會導致編譯錯誤或無法匹配參數來調用模擬方法。如何在ARC中的OCMock中模擬**參數

  1. OCMOCK_ANY
  2. [OCMArg anyPointer]
  3. 創建一個NSError對象錯誤和所述[OCMArg setTo:錯誤。

沒有用。

如何模擬這種方法?請指教。

編輯

-(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模擬工作。

回答

19

您可以使用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 
+0

[[[WCM存根] andCall:@selector(mockGetWakeupCallsForRoomNumber:錯誤:) onObject:自] getWakeupCallsForRoomNumber:OCMOCK_ANY誤差:((NSError __autoreleasing **)[OCMArg anyPointer])];調用不會調用模擬方法。請幫忙。 – Saran

+0

請將您正在測試的測試用例和代碼添加到您的問題中。 –

+0

添加了代碼。這是在庫中負責連接後端服務器。我的意圖是有能力提供模擬,直到在後端實施所需的服務。 – Saran

2

最後這是我實施的。

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