9

我遇到了障碍,我想知道这里聪明的集体思想是否可以提供帮助。在 ObjC CocoaTouch 中,我试图模拟一个接受结构参数并返回结构的对象。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 和结构方面遇到过类似的问题吗?如果是这样,处理这些类型的最佳方法是什么?

4

4 回答 4

3

你很亲密。你的#define 应该是:

#define OCMOCK_STRUCT(atype, variable) [NSValue valueWithBytes:&variable withObjCType:@encode(atype)]
于 2010-06-07T14:42:03.903 回答
3

最好的答案实际上是克里夫本人:http ://codeforfun.wordpress.com/2009/02/07/ocmock-return-a-struct/

他只是没有更新这个问题,羞耻:)

于 2011-02-21T01:09:02.317 回答
2

我对宏观答案有疑问;编写一个帮助函数,返回测试类中的结构并使用:

[[[mockObject stub] andCall:@selector(selectorName) onObject:self] someMethod];

工作得很好。

于 2010-09-30T16:50:37.877 回答
0

有时,手工编码的模拟比试图强制模拟对象框架超出其正常使用模式更容易。

于 2010-01-09T03:42:09.160 回答