从模拟方法崩溃返回CGRect

时间:2013-05-15 07:28:15

标签: iphone ios ocmock

我刚刚练习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以及如何解决此崩溃,我想知道为什么会发生这种崩溃。

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

提前致谢。

P.S:如果我用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 CGFloat变量创建一个结构,Mocked方法将为我提供正确的结构,而如果我使用2 double变量或3 CGFloat变量创建结构,它将会崩溃。

有趣:)

2 个答案:

答案 0 :(得分: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];
 }

或者,您可以使用Using a struct with OCMock or Hamcrest

中的OCMOCK_STRUCT
- (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];
 }

答案 1 :(得分:0)

这似乎是 OCMock 中的bug。现在已经修好了。