我刚刚练习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
变量创建结构,它将会崩溃。
有趣:)
答案 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。现在已经修好了。