2013-10-15 54 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:

我試着方法攪拌,但它似乎只是用於存根。

+0

我不你真的明白你的問題。你只想調用+(void)方法:(NSString *)字符串對象:(id)來自+(void)方法的對象:(NSString *)string? –

+0

@ user2404543是的,只是想要一個健全的檢查,以確保它不會流浪,如果我決定以後添加功能 –

+0

林不知道我明白了..爲什麼不能只調用[CustomClass方法:字符串對象:無] ;從+(無效)方法:(NSString *)字符串? –

回答

3

你可以測試,既使用方法swizzling或OCMock。

隨着法混寫,首先我們在測試中實現文件中聲明以下變量:

static NSString *passedString; 
static id passedObject; 

然後,我們實現一個存根方法(在測試類)和去與混寫:

+ (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示例工作,但我不得不將'Method stubMethod'更改爲'class_getInstanceMethod'。對於OCMock的例子,我無法使它工作。我得到了'NSProxy doesNotRecognizeSelector ...'。我認爲這是因爲模擬對象是一個CustomClass實例的模擬,而不是類本身。調用類方法永遠不會到達實例(我認爲) –

+0

我想你使用了class_getInstanceMethod,因爲你將stubbed方法聲明爲一個實例,而不是像我一樣的類。關於OCMock示例,您使用的是哪個版本的OCMock(嘲諷類方法,從2.1開始可能)?我知道模擬對象是實例的模擬,但這是用OCMock模擬類方法的方法(查看文檔)。 – e1985