ios – 在Swift中为类扩展编写单元测试

ios – 在Swift中为类扩展编写单元测试,第1张

概述我正在尝试为 Swift中的类扩展编写单元测试.类扩展本身将呈现具有指定标题和消息的UIAlert: extension UIViewController { func presentAlert(title: String, message : String) { let alertController = UIAlertController(title: title, 我正在尝试为 Swift中的类扩展编写单元测试.类扩展本身将呈现具有指定标题和消息的UIAlert:

extension UIVIEwController {    func presentAlert(Title: String,message : String) {        let alertController = UIAlertController(Title: Title,message: message,preferredStyle: .Alert)            alertController.addAction(UIAlertAction(Title: "Close",style: UIAlertActionStyle.Default,handler: nil))        UIApplication.sharedApplication().keyWindow?.rootVIEwController?.presentVIEwController(alertController,animated: true,completion: nil)    }}

我为我的单元测试创​​建了一个包含以下代码的文件:

import XCTestclass AlertTest: XCTestCase {    func testAlert() {        let alert = presentAlert("Presented Alert","This is an Alert!")    }}

但是,我一直收到“使用未解析的标识符’presentAlert’”的错误.在咨询了SO thread之后,我尝试将公开添加到我的扩展中:

public func presentAlert(Title:String,message:String)

但仍然没有运气.有人有见识吗?

编辑

基于@hkgumbs的答案,这是我的警报扩展的当前代码:

import Foundationprotocol Presentable {}extension UIVIEwController {    public func presentAlert(Title: String,completion: nil)    }}

在视图控制器中,我想要显示警报,这仍然是调用警报的正确方法,对吗?

self.presentAlert("InvalID URL",message: "Please try again")

其次,基于你的评论,这就是我通过在虚拟值上调用Presentable而理解的内容,但它是不正确的,因为SomethingPresentable没有成员PresentAlert.我理解的地方出错了?

func testAlert() {    let app = XCUIApplication()    struct SomethingPresentable: Presentable {}    SomethingPresentable.presentAlert("Presented Alert",message: "This is an Alert!")    XCTAssert(app.alerts["Presented Alert"].exists)    app.alerts["Presented Alert"].tap();}

编辑2
@hkgumbs,根据您的最新评论,这就是我对扩展的看法:

import Foundationprotocol Presentable {}extension Presentable {    func presentAlert(Title: String,completion: nil)    }}

这就是我试图从我的VIEwController调用它的方式:

Presentable.presentAlert("InvalID URL",message: "Please try again")

但是,我得到一个错误“在类型Self上使用实例成员presentAlert;你的意思是使用Self类型的变量吗?”

然后,我猜这是测试的样子?

func testAlert() {    let app = XCUIApplication()    struct SomethingPresentable: Presentable {}    SomethingPresentable.presentAlert("Presented Alert",message: "This is an Alert!")    XCTAssert(app.alerts["Presented Alert"].exists)    app.alerts["Presented Alert"].tap();}
解决方法 正如 @dan所提到的,你需要从UIVIEwController的一个实例中调用它.通常你不想在测试中实例化框架对象,如果你可以避免它,所以这里有一些选项可以避免:

>使presentAlert静态,以便您可以只使用UIVIEwController.presentAlert
>使presentAlert成为一个自由函数(不要把它放在扩展中)
>扩展协议 – 我认为这是最干净的选择

protocol Presentable {}extension Presentable {    func presentAlert(Title: String,message : String) { /* ... */ }}

然后,无论何时需要,您都可以扩展UIVIEwController:Presentable {}.在测试中,您可以使用虚拟类.这种方法的另一个好处是,如果需要,您可以在任何类型上重用该功能,而不会在不需要时全局暴露它.

附录

当我们扩展协议时,我们说“实现此协议的任何东西都将免费获得此方法.”这里的诀窍是这个协议是空的,因此很容易“实现”.

extension YourVIEwController: Presentable {}
总结

以上是内存溢出为你收集整理的ios – 在Swift中为类扩展编写单元测试全部内容,希望文章能够帮你解决ios – 在Swift中为类扩展编写单元测试所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1067259.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-26
下一篇2022-05-26

发表评论

登录后才能评论

评论列表(0条)

    保存