OCMock 对带有参数的方法进行 OCMock 并返回一个值

Posted

技术标签:

【中文标题】OCMock 对带有参数的方法进行 OCMock 并返回一个值【英文标题】:OCMock on a method with argument and returns a value 【发布时间】:2010-01-06 18:24:37 【问题描述】:

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

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

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

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

使用调用格式:

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

告诉模拟它需要接受 dictionaryForKey 方法。但不知何故,这没有被记录下来,或者不是告诉模拟期望的正确事情,因为错误告诉我模拟永远不知道期望“dictionaryForKey”调用。

我调用存根的 andReturn 的方式似乎非常相似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】:

不确定您是否发现了这一点,但这可能与使用带有验证的存根有关。您应该将 verify 与 expect 一起使用。

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

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

【讨论】:

以上是关于OCMock 对带有参数的方法进行 OCMock 并返回一个值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ocmock 验证部分模拟是不是具有使用 args 调用的基本方法?

如何在ARC的OCMock中模拟**参数

带有中间变量的 OCMock 测试代码

使用 OCMock 和 MagicalRecord 进行单元测试

所有调用的 OCMock 存根类方法

当参数不是预期的参数时,OCMock 抛出 NSInternalInconsistencyException