ios 模拟GMSPlace

nkcskrwz  于 2023-05-08  发布在  iOS
关注(0)|答案(1)|浏览(85)

我目前正在使用Google Places,并创建了一个抽象的地点选择器,也是一个使用Google Places的具体实现。
我正在为它做一些单元测试。我来到了我想模拟GMSPlace(https://developers.google.com/places/ios-sdk/reference/interface_g_m_s_place)的步骤
问题是GMSPlace类的默认初始化不可用。

/**
 * Default init is not available.
 */
- (instancetype)init NS_UNAVAILABLE;

有人能分享一下我们如何在init不可用的情况下模拟这些东西吗?
谢谢

ovfsdjhp

ovfsdjhp1#

这可能是测试GMSPlace的替代方法。GMSPlace是Google Places API for iOS中的一个类。它代表一个特定的地方,包括它的名称、地址和其他细节。如果您想模拟GMSPlace进行测试,可以使用依赖注入和协议。
1 -创建一个协议,它表示您需要从GMSPlace获得的必要属性和方法。

protocol Place {
    var name: String { get }
    var placeID: String { get }
    // Add other properties and methods you need
 }

2 -创建一个符合Place协议的mock类。

class MockPlace: Place {
    var name: String
    var placeID: String
    // Add other properties and methods you need
        
    init(name: String, placeID: String) {
      self.name = name
      self.placeID = placeID
    }
}

3-扩展GMSPlace类以符合Place协议。

extension GMSPlace: Place {
    // GMSPlace already provides the required properties and methods,
    // so you don't need to add anything here.
}

4-修改您的代码以依赖于Place协议而不是直接依赖于GMSPlace类。这允许您在代码中使用真实的的GMSPlace对象或MockPlace对象,使其更具可测试性。

class MyViewController: UIViewController {
 var selectedPlace: Place?

 func didSelectPlace(place: Place) {
    selectedPlace = place
    // Do something with the selected place
 }
}

5-现在可以使用MockPlace类进行测试。

func testDidSelectPlace() {
 let myViewController = MyViewController()
 let mockPlace = MockPlace(name: "Test Place", placeID: "123456")

 myViewController.didSelectPlace(place: mockPlace)

 XCTAssertEqual(myViewController.selectedPlace?.name, "Test Place")
 XCTAssertEqual(myViewController.selectedPlace?.placeID, "123456")
}

相关问题