2013-10-15 4 views
3

Так что я хочу, чтобы иметь возможность рассчитывать метод класса вызывается для одного из моих классовOCMock ожидать метод класса

@implementation CustomClass 

+ (void)method:(NSString*)string{ 
    [[self class] method:string object:nil]; 

} 

+ (void)method:(NSString *)string object:(id)object { 
    //do something with string and object 
} 

@end 

и я хочу, чтобы позвонить [CustomClass method:@""] и ожидать method: string:

Я пробовал метод swizzling, но похоже, что это полезно только для stubbing.

+0

Я не» я действительно понимаю ваш вопрос. Вы хотите только вызвать метод + (void): (NSString *) string object: (id) object from + (void) метод: (NSString *) string? –

+0

@ user2404543 Да, просто хочу проверить здравомыслие, чтобы убедиться, что он не бродят, если я решит добавить функциональность позже –

+0

Im не уверен, что я понял .. почему вы не можете просто вызвать [CustomClass method: string object: nil] ; from + (void) метод: (NSString *) string? –

ответ

3

Вы можете проверить это, используя метод swizzling или OCMock.

С методом swizzling, в первую очередь мы объявляем следующие переменные в тестовом файле реализации:

static NSString *passedString; 
static id passedObject; 

Затем мы реализуем метод заглушки (в тестовом классе) и идти с swizzling:

+ (void)stub_method:(NSString *)string object:(id)object 
{ 
    passedString = string; 
    passedObject = object; 
} 

- (void) test__with_method_swizzling 
{ 
    // Test preparation 
    passedString = nil; 
    passedObject = [NSNull null];// Whatever object to verify that we pass nil 

    Method originalMethod = 
     class_getClassMethod([CustomClass class], @selector(method:object:)); 
    Method stubMethod = 
     class_getClassMethod([self class], @selector(stub_method:object:)); 

    method_exchangeImplementations(originalMethod, stubMethod); 

    NSString * const kFakeString = @"fake string"; 

    // Method to test 
    [CustomClass method:kFakeString]; 

    // Verifications 
    STAssertEquals(passedString, kFakeString, nil); 
    STAssertNil(passedObject, nil); 

    method_exchangeImplementations(stubMethod, originalMethod); 
} 

Но мы можем сделать то же самое с OCMock в гораздо более простым способом:

- (void) test__with_OCMock 
{ 
    // Test preparation 
    id mock = [OCMockObject mockForClass:[CustomClass class]]; 

    NSString * const kFakeString = @"fake string"; 
    [[mock expect] method:kFakeString object:nil]; 

    // Method to test 
    [CustomClass method:kFakeString]; 

    // Verifications 
    [mock verify]; 
} 
+0

спасибо за примеры! Я смог сделать пример не OCMock, но мне пришлось изменить 'метод stubMethod' на' class_getInstanceMethod'. Для примера OCMock я не смог заставить его работать. Я получаю «NSProxy doesNotRecognizeSelector ...». Я думаю, что это из-за того, что макет-объект является макетом экземпляра CustomClass вместо самого класса. вызов метода класса никогда не достигает экземпляра (я думаю) –

+0

Я предполагаю, что вы использовали class_getInstanceMethod, потому что вы объявляете оштукатуренный метод как экземпляр, а не класс, как я. А про образец OCMock, какую версию OCMock вы используете (издевательские методы класса возможны с 2.1)? Я знаю, что макет-объект является макетом экземпляра, но это способ издеваться над методом класса с OCMock (проверить документы). – e1985

Смежные вопросы