我正在路障,我想知道这里出色的集体思想是否有帮助。在ObjC CocoaTouch中,我试图模拟一个接受struct参数并返回结构的对象。 OCMock正在咳嗽一个发球,所以我尝试用Hamcrest匹配器包裹。没死。我正在测试的函数/方法看起来像这样:
- (CLLocationCoordinate2D)pixelToLatLong:(CGPoint)aPoint;
我使用这样的代码:
#define OCMOCK_STRUCT(atype, variable) [NSValue value:&variable withObjCType:@encode(atype)]
-(void) testMyWidget
{
CLLocationCoordinate2D ulLL = (CLLocationCoordinate2D){123,456};
CLLocationCoordinate2D lrLL = (CLLocationCoordinate2D){654,321};
[[[(id)myObj expect] andReturn:OCMOCK_STRUCT(CLLocationCoordinate2D, ulLL)] pixelToLatLong:(CGPoint){0,0}];
[[[(id)myObj expect] andReturn:OCMOCK_STRUCT(CLLocationCoordinate2D, lrLL)] pixelToLatLong:(CGPoint){320,460}];//lower right point
}
那种方式有效。因此,在我的测试中,我正在测试我进行必要的编辑以获得绿色条...错误..构建信息窗口中的绿色按钮。当我确定我的测试应该通过时,我会得到断言失败的错误。这些错误告诉我该方法被意外调用,并将这些结构的值列为问号。我尝试用Hamcrest匹配器包裹结构但是我无处可去。我正准备打破我的调试器,这无疑会告诉我什么是错的。这里有人和OCMock / Hamcrest和结构有类似的麻烦吗?如果是这样,处理这些类型的最佳方法是什么?
答案 0 :(得分:3)
你非常接近。你的#define应该是:
#define OCMOCK_STRUCT(atype, variable) [NSValue valueWithBytes:&variable withObjCType:@encode(atype)]
答案 1 :(得分:3)
最好的答案实际上就是克利夫本人:http://codeforfun.wordpress.com/2009/02/07/ocmock-return-a-struct/
他只是没有更新这个问题,耻辱耻辱:)。
答案 2 :(得分:2)
我的宏观答案有问题;编写一个帮助函数,它在测试类中返回结构并使用:
[[[mockObject stub] andCall:@selector(selectorName) onObject:self] someMethod];
工作得很好。
答案 3 :(得分:0)
有时,手工编码的模拟比在正常使用模式之外强制模拟对象框架更容易。