使用自定义值创建CLPlacemark以进行测试

6
我有一个应用程序,可以移动 CLPlacemark 对象并使用它们,我想对与它们交互的几个组件进行单元测试。为此,我希望能够通过方法将对真实反向地理编码的调用替换为生成具有已知值的模拟 CLPlacemarkCLPlacemark 只有一个初始化程序(复制初始化程序)。但是在文档中,它说:

地标对象通常由 CLGeocoder 对象生成,尽管您也可以自己显式地创建它们。

但是,大多数成员都是只读的,因此我不确定如何创建具有自定义值的对象。在 Swift 中是否可能以此方式设置内部属性?如果不行,你对上述引文的含义有什么想法吗?
2个回答

0

我会使用 OCMock (http://ocmock.org) 来模拟调用以创建 CLPlacemark 对象,并以自己的值来存根它们的 getter 方法。

id userDefaultsMock = OCMClassMock([CLPlacemark class]);

// set it up to return a specific value when stringForKey: is called
OCMStub([userDefaultsMock property]).andReturn(customValue);

谢谢你的建议。我一直避免使用OCMock,因为它严格设计用于ObjcC,但我相信我可以找到自己的方法(即子类或其他方式)来存根属性获取器。 - qqq

0
这里有一些考古学的东西,但是我这里有一个可行的答案,因为我刚刚有这个需求。
    public static func mock(coordinate: CLLocationCoordinate2D, name: String) -> CLPlacemark {
        let mkPlacemark = MKPlacemark(
            coordinate: coordinate,
            addressDictionary: ["name": name]
        )
        return CLPlacemark(placemark: mkPlacemark)
    }

使用方法:

let placemark = CLPlacemark.mock(
    coordinate: CLLocation(latitude: 0, longitude: 0), name: "mock-name"
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接