OCMock

2010-12-05 10 views
27

ile bir BOOL döndüren bir yöntem saplama OCMock 1.70 kullanıyorum ve bir BOOL değeri döndüren basit bir yöntem alayında bir sorun yaşıyorum. İşte kodum:OCMock

@interface MyClass : NSObject 
- (void)methodWithArg:(id)arg; 
- (BOOL)methodWithBOOLResult; 
@end 
@implementation MyClass 
- (void)methodWithArg:(id)arg { 
    NSLog(@"methodWithArg: %@", arg); 
} 
- (BOOL)methodWithBOOLResult { 
    NSLog(@"methodWithBOOLResult"); 
    return YES; 
} 
@end 

- (void)testMock { 
    id real = [[[MyClass alloc] init] autorelease]; 
    [real methodWithArg:@"foo"]; 
    //=> SUCCESS: logs "methodWithArg: foo" 

    id mock = [OCMockObject mockForClass:[MyClass class]]; 
    [[mock stub] methodWithArg:[OCMArg any]]; 
    [mock methodWithArg:@"foo"]; 
    //=> SUCCESS: "nothing" happens 

    NSAssert([real methodWithBOOLResult], nil); 
    //=> SUCCESS: logs "methodWithBOOLResult", YES returned 

    BOOL boolResult = YES; 
    [[[mock stub] andReturn:OCMOCK_VALUE(boolResult)] methodWithBOOLResult]; 
    NSAssert([mock methodWithBOOLResult], nil); 
    //=> FAILURE: raises an NSInvalidArgumentException: 
    // Expected invocation with object return type. 
} 

Neyi yanlış yapıyorum? - Özellikle NSNumberandReturnValue:herhangiNSValue kabul eder:

cevap

60

Sen andReturnValue: değil andReturn:

[[[mock stub] andReturnValue:OCMOCK_VALUE(boolResult)] methodWithBOOLResult]; 
5

İpucu kullanmak gerekir. İlkel/skaler döndürme değerleriyle daha hızlı bir şekilde yöntemleri yönlendirmek için, yerel değişken bildirimini tamamen atlayın ve [NSNumber numberWithXxx:...] kullanın.

[[[mock stub] andReturnValue:@(NO)] methodWithBOOLResult]; 
[[[mock stub] andReturnValue:@(123)] methodWithIntResult]; 
[[[mock stub] andReturnValue:@(123.456)] methodWithDoubleResult]; 
etc. 
+1

OCMock'un daha yeni sürümleri OCMOCK_VALUE'nin sabitler üzerinde de çalışmasına izin vermelidir; OCMOCK_VALUE (NO) '' '' 'NO''' ve' '' (NO) '' '' 'tüm çalışması gerekir. –

1

Ben OCMock sürümünü 3.3.1 kullanıyorum:

otomatik boks bonus puan için
[[[mock stub] andReturnValue:[NSNumber numberWithBool:NO]] methodWithBOOLResult]; 

, sayı-değişmez sözdizimini (Clang docs) kullanabilirsiniz: Örneğin

ve bu sözdizimi benim için çalışıyor:

SomeClass *myMockedObject = OCMClassMock([SomeClass class]); 
OCMStub([myMockedObject someMethodWithSomeParam:someParam]).andReturn(YES); 

daha örneğin OCMock documentation bakınız.