
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中为类扩展编写单元测试所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)