gpt4 book ai didi

swift - 如何在 Swift 中修补/模拟一个方法?

转载 作者:行者123 更新时间:2023-11-28 06:03:09 25 4
gpt4 key购买 nike

我还没有使用 Swift 的经验。

如果我有一段代码可以做到这一点:

if UserDefaults.standard.bool(forKey: Constants.isTermsAccepted) == false {
openDisclaimer()
}

在 Python 中,我可以修补 openDisclaimer() 方法以将其替换为 MagicMock。一旦我运行测试,断言就会显示是否调用了 MagicMock。我不关心该方法内部发生了什么,只关心它是否被调用。

在 Swift 中可以实现类似的功能吗?

更新:

添加方法的实现

func openDisclaimer() {
let popupVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "disclaimerPopUp") as! DisclaimerViewController
self.addChildViewController(popupVC)
popupVC.view.frame = self.view.frame
self.view.addSubview(popupVC.view)
popupVC.didMove(toParentViewController: self)
}

最佳答案

您不能模拟 (/swizzle) 任意 Swift 函数,它们通常是静态绑定(bind)的而不是动态调度的(这就是为什么它应该是 swift 的原因)。您需要围绕此设计代码,例如使用协议(protocol)和依赖注入(inject),而不是调用具体函数。

OCMock 有一个很好的 blog entry关于这方面的问题。

更新更新:“方法的实现”是您想要模拟/替换的东西。因此,您需要将该依赖项注入(inject)调用 openDisclaimer 的代码。有很多方法可以做到这一点,一种是传入一个闭包。

旧的:

func showDisclaimerIfNecessary() {
if !UserDefaults.standard.bool(forKey: Constants.isTermsAccepted) {
openDisclaimer()
}
}

新的可测试的:

func showDisclaimerIfNecessary(_ action: () ->() = openDisclaimer) {
if !UserDefaults.standard.bool(forKey: Constants.isTermsAccepted) {
action()
}
}

调用生产:

showDisclaimerIfNecessary()

调用测试:

var didCall = false
showDisclaimerIfNecessary() {
didCall = true
}
XCTAssert(didCall, "....")

但通常您可能希望围绕抽象类型构建代码并将它们作为依赖项注入(inject)(而不是像上面所示那样使用闭包进行细粒度的方式)。

关于swift - 如何在 Swift 中修补/模拟一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48979774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com