我只是在练习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
- Using a struct with OCMock or Hamcrest
- OCMock testing the address of a struct
如果您使用帖子提供的类别 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];
}
关于iphone - 从模拟方法崩溃返回 CGRect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16559191/