14

我只是在练习OCMock,我在这里面临的问题是

我有一个名为foo返回CGRect的方法,这个方法是从另一个方法调用的callFoo

-(CGRect)foo {
    return CGRectMake(10, 10, 10, 10);
}
-(void)callFoo {
    CGRect rect = [self foo];
    NSLog(@"%@",NSStringFromCGRect(rect));
}

我的方法单元测试callFoo如下。

- (void)test__callFoo__invokesWithMockingFoo
{
     ViewController *sut = [[ViewController alloc] init];
     id master = [OCMockObject partialMockForObject:sut];

     CGRect rect = CGRectMake(0, 0, 0, 0);
     [[[master expect] andReturnValue:OCMOCK_VALUE(rect)] foo];
     [sut callFoo];
     [master verify];
 }

当这个测试用例运行时,当它到达时我遇到了意外的崩溃CGRect rect = [self foo];
我想知道如果我们CGRect从这里返回,为什么会发生这种崩溃mocked method以及如何解决这个崩溃。

任何人都可以帮助解决这个问题。

提前致谢。

PS:如果我用 NSValue 替换 CGRect,这很好用。 As shown below

 -(NSValue *)foo {
      return [NSValue valueWithCGRect:CGRectMake(10, 10, 10, 10)];
  }
  -(void)callFoo {
      CGRect rect = [[self foo] CGRectValue];
      NSLog(@"%@",NSStringFromCGRect(rect));
  }

在我的测试用例中,

 NSValue *rect = [NSValue valueWithCGRect:CGRectMake(0, 0, 0, 0)];
 [[[master expect] andReturn:rect] foo];

更新:
这看起来像是内存问题[但我不确定,只是猜测]。

如果我创建具有 2 个变量的结构,模拟方法将为我提供正确的结构,而如果我创建具有 2 个变量或 3 个变量CGFloat的结构,它会崩溃。doubleCGFloat

有趣的 :)

4

2 回答 2

4

OCMOCK_VALUE通常用于原语(BOOL、NSInteger 等)。OCMOCK_VALUE根据以下链接,它似乎不适用于结构。

如果您使用OCMock Return a struct帖子提供的类别,您可以执行以下操作:

- (void)test__callFoo__invokesWithMockingFoo {
     ViewController *sut = [[ViewController alloc] init];
     id master = [OCMockObject partialMockForObject:sut];

     CGRect rect = CGRectMake(0, 0, 0, 0);
     [[[master expect] andReturnStruct:&rect objCType:@encode(CGRect)] foo];
     [sut callFoo];
     [master verify];
 }

或者,您可以使用OCMOCK_STRUCT带有OCMock 或 Hamcrest 的结构

- (void)test__callFoo__invokesWithMockingFoo {
     ViewController *sut = [[ViewController alloc] init];
     id master = [OCMockObject partialMockForObject:sut];

     CGRect rect = CGRectMake(0, 0, 0, 0);
     [[[master expect] andReturn:OCMOCK_STRUCT(CGRect, rect)] foo];
     [sut callFoo];
     [master verify];
 }
于 2013-05-24T16:07:37.573 回答
0

这似乎. OCMock现在已修复。

于 2013-09-30T10:49:25.297 回答