iphone - 从模拟方法崩溃返回 CGRect

标签 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];
时我遇到意外崩溃 我想知道如果我们从 mocked method 返回 CGRect 会发生这种崩溃,以及如何解决这种崩溃。

谁能帮忙解决这个问题。

提前致谢。

P.S : 如果我用 NSValue 替换 CGRect,这工作正常。 如下图

 -(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 变量创建结构,模拟方法将给我正确的结构,而如果我使用 2 个 double 变量或 3 个 CGFloat 变量。

有趣:)

最佳答案

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 HamcrestOCMOCK_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];
 }

关于iphone - 从模拟方法崩溃返回 CGRect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16559191/

相关文章:

ios - 需要有关 iOS 的 BDD 的建议

iPhone:UITextView 环绕 UIImage?

iphone - iOS 设置 UINavigationBar 标题中按钮的大小

iphone - iOS :Get UIImage Orientation inside a UIImageview with exif data?

ios - Xcode 的 ios 开发中缺少框架

objective-c - iOS - 单元测试异步代码

ios - 将大对象从 ViewController 发送到 Objective C 中的另一个,ios?

iphone - SVProgressHUD - 禁用用户交互

ios - 单击 "LOGIN"后添加事件指示器?

ios - 如何部分模拟外部对象