2013-10-15 38 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