OCMock在带参数的方法上返回一个值

时间:2010-01-06 18:24:38

标签: iphone objective-c ocmock

我有一个依赖于NSUserDefaults的类,我正在尝试进行单元测试,并且我将NSUserDefaults作为模拟提供给我的测试类。运行测试时,我收到错误:

  

OCMockObject [NSUserDefaults的]:   调用了意外的方法:   dictionaryForKey:@ “响应”

我正在尝试模拟NSUserDefaults类的这个实例方法:

- (NSDictionary *)dictionaryForKey:(NSString *)defaultName;

使用通话格式:

[[[mockClass stub] andReturn:someDictionary] dictionaryForKey:@"aKey"]

告诉mock它需要期望的是dictionaryForKey方法。但不知何故,这不是记录或者不是告诉模拟预期的正确的事情,因为错误告诉我模拟从来不知道期待'dictionaryForKey'调用。

我调用存根和返回的方式看起来非常相似to this question,但在那一个中​​,海报说他们获得了返回值。 我的测试用例:

-(void)testSomeWork
{
    id userDefaultsMock = [OCMockObject mockForClass:[NSUserDefaults class]];       
    MyClass *myClass = [[MyClass alloc] initWith:userDefaultsMock];

    NSDictionary *dictionary = [NSDictionary dictionary];

    [[[userDefaultsMock stub] andReturn:dictionary] dictionaryForKey:@"response"];

    BOOL result = [myClass doSomeWork];

    STAssertTrue(result, @"not working right");

    [myClass release];
    [userDefaultsMock verify];
}

我的课程:

@implementation MyClass

@synthesize userDefaults;
- (id)initWith:(NSUserDefaults *aValue)
{
    if (self = [super init])
    {
        self.userDefaults = aValue;
    }
    return self;
}

- (BOOL)doSomeWork
{
    NSDictionary *response = [userDefaults dictionaryForKey:@"response"];

    if (response != nil)
    {
        // some stuff happens here
        return YES;
    }

    return NO;
}   
@end

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

不确定你是否认识到这一点,但这可能与使用stub验证有关。你应该使用expect with expect。

即。

[[[userDefaultsMock expect] andReturn:dictionary] dictionaryForKey:@"response"];
...
[userDefaultsMock verify];

在这种情况下,您使用verify来确认您的方法确实调用了预期的方法(dictionaryForKey :)。您使用存根来允许您的方法在Mock对象上调用给定方法,但您不需要验证它是否被调用。