Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在XCTestCase中解除警报_Ios_Swift_Xctest_Xctestcase - Fatal编程技术网

Ios 如何在XCTestCase中解除警报

Ios 如何在XCTestCase中解除警报,ios,swift,xctest,xctestcase,Ios,Swift,Xctest,Xctestcase,测试用例 class ProfileVC: BaseUIVC { var dispatchGroupHelper: DispatchGroupImpl var isFlag: Bool init(dispatchGroupHelper: DispatchGroupImpl = DispatchGroupHelper(), isFlag: Bool = false) { self.dispatchGroupHelper = dispatchGroupHelp

测试用例

class ProfileVC: BaseUIVC {
    var dispatchGroupHelper: DispatchGroupImpl
    var isFlag: Bool
    init(dispatchGroupHelper: DispatchGroupImpl = DispatchGroupHelper(), isFlag: Bool = false) {
        self.dispatchGroupHelper = dispatchGroupHelper
        self.isFlag = isFlag
        super.init(nibName: nil, bundle: currentBundle())
    }

    func save() {
        print("Outside isFlag : \(isFlag)")
        print("Outside self : \(self)")
        if let info = getData() {             
            showAlertOnWindow(message: "message") { (_) in
                print("Inside isFlag : \(self.isFlag)")
                print("Inside self : \(self)")
                if param.count > 0 {
                   self.dispatchGroupHelper.joinDispatchGroup()
                   self.requestAPI1(data: param)
                }
                if isFlag {
                    self.dispatchGroupHelper.joinDispatchGroup()
                    self.requestAPI2(data: param)
                }
                self.dispatchGroupHelper.notifyDispatchGroup(execute: {
                    self.handleResponse()
                })
            }
        }
    }

    public func showAlertOnWindow(title: String? = "", message: String? = nil,
                                  completionHandler: ((_ title: String) -> Void)? = nil) {
        let alert = UIAlertController(title: title ?? "", message: message,
                                      preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "dummy", style: UIAlertActionStyle.default, handler: { (_) in
            if let completionHanlder = completionHandler {
                completionHanlder("OK")
            }
        }))
        alert.show()
        print("Display alert : \(alert)")
    }
}
class DispatchGroupHelper: DispatchGroupImpl {
    lazy var group: DispatchGroup? = {
        return DispatchGroup()
    }()
}
protocol DispatchGroupImpl {
    var group: DispatchGroup? { get }
    func joinDispatchGroup()
    func leaveDispatchGroup()
    func notifyDispatchGroup(execute: @escaping () -> Void)
}

extension DispatchGroupImpl {
    func joinDispatchGroup() {
        group?.enter()
    }

    func leaveDispatchGroup() {
        group?.leave()
    }

    func notifyDispatchGroup(execute: @escaping () -> Void) {
        group?.notify(queue: DispatchQueue.main, execute: execute)
    }
}

extension UIViewController {
    func show() {
        present(animated: true, completion: nil)
    }

    func present(animated: Bool, completion: (() -> Void)?) {
        if let rootVC = UIApplication.shared.keyWindow?.rootViewController {
            if #available(iOS 13.0, *), let navVC = rootVC as? UINavigationController,
                let visibleVC = navVC.visibleViewController {
                print("VisibleVC : \(visibleVC)")
                visibleVC.showPrompt(withAlertController: self)
            } else {
                rootVC.showPrompt(withAlertController: self)
            }
        }
    }
}

public extension UIAlertController {
        func tapButton(title: String) {
            guard let action = actions.first(where: {$0.title == title}), let block = action.value(forKey: "handler") else {
            return
        }
        let handler = unsafeBitCast(block as AnyObject, to: AlertHandler.self)
        handler(action)
    }
}
单独运行测试是通过的。但当所有测试都在ProfileTests中运行时
testAPIWhenIsFlagTrue:通过
testAPIWhenIsFlagFalse:失败

class MockDispatchGroupImpl: DispatchGroupImpl {
    let group: DispatchGroup?
    var joinCount = 0
    var leaveCount = 0
    var isNotifyCalled = false
    init(group: DispatchGroup) {
        self.group = group
    }
    func joinDispatchGroup() {
        joinCount += 1
        print("Join: \(joinCount)")
    }
    func leaveDispatchGroup() {
        leaveCount += 1
        print("Leave")
    }
    func notifyDispatchGroup() {
        isNotifyCalled = true
        print("Notify")
    }
}

class ProfileTests: XCTestCase {
    func testAPIWhenIsFlagTrue() {
        var mockDispatchGroupHelper: MockDispatchGroupImpl? = MockDispatchGroupImpl(group: DispatchGroup())
        var profilerVC = getProfileVC(dispatchGroupHelper: mockDispatchGroupHelper!, isFlag: true)
        profilerVC?.save()
        let alert = UIApplication.shared.keyWindow?.rootViewController?.presentedViewController as! UIAlertController
        alert.tapButton(title: "OK")
        print("Capture Alert : \(alert)")
        print("TAP")
        XCTAssertEqual(mockDispatchGroupHelper?.joinCount, 2)
    }

    func testAPIWhenIsFlagFalse() {
        var mockDispatchGroupHelper: MockDispatchGroupImpl? = MockDispatchGroupImpl(group: DispatchGroup())
        var profilerVC = getProfileVC(dispatchGroupHelper: mockDispatchGroupHelper!, isFlag: false)
        profilerVC?.save()
        let alert = UIApplication.shared.keyWindow?.rootViewController?.presentedViewController as! UIAlertController
        alert.tapButton(title: "OK")
        print("Capture Alert : \(alert)")
        print("TAP")
        XCTAssertEqual(mockDispatchGroupHelper?.joinCount, 1)
    }
}
调试结果

"XCTAssertEqual failed: ("Optional(0)") is not equal to ("Optional(1)")"
[“testAPIWhenIsFlagTrue”]
外部isFlag:true
外部自我:
可见VC:
**显示警报:**
**[“捕获警报:”]**
[“轻敲”]
内部isFlag:true
内在自我:
[“加入:1”]
[“加入:2”]
[“通知”]
[“testAPIWhenIsFlagFalse”]
外部isFlag:false
外部自我:
**VisibleVC:)**
显示警报:
**[“捕获警报:”]**
[“轻敲”]
内部isFlag:true
内在自我:
[“加入:3”]
[“加入:4”]
[“通知”]
XCTASERTEQUAL失败:(“可选(0)”不等于(“可选(1)”)
观察:
)
两个测试的警报捕获相同。
加入计数增加到4

在功能上

点击按钮()

我们正在调用警报操作处理程序,但没有取消实际的警报。 如何在XCTestCase中解除警报?
注意:-showAlertOnWindow()位于实用程序类中,并已被各种类使用。

单元测试警报最安全的方法是不让它们实际出现。已记录但未显示警报的情况下:

  • 警报不会干扰测试
  • 测试不会相互干扰
为此,请尝试使用。在测试代码中,实例化一个
警报验证器
。然后打电话

  • verify()
    以确认其外观和其他属性
  • executeAction(forButton:)
    调用特定按钮的闭包

没有必要忽略任何内容,因为当存在
警报验证器时,不会显示真正的警报。

单元测试警报最安全的方法是不让它们实际出现。已记录但未显示警报的情况下:

  • 警报不会干扰测试
  • 测试不会相互干扰
为此,请尝试使用。在测试代码中,实例化一个
警报验证器
。然后打电话

  • verify()
    以确认其外观和其他属性
  • executeAction(forButton:)
    调用特定按钮的闭包
没有必要忽略任何内容,因为当存在
警报验证器时,不会显示真正的警报。

["testAPIWhenIsFlagTrue"]
Outside isFlag : true
Outside self: <ProfileVC: 0x7fdd13818600>
VisibleVC : <SplashViewController: 0x7fdd123023d0>
**Display alert : <UIAlertController: 0x7fdd1282a000>**    
**["Capture Alert : <UIAlertController: 0x7fdd1282a000>"]**
["TAP"]
Inside isFlag : true
Inside self: <ProfileVC: 0x7fdd13818600>
["Join: 1"]
["Join: 2"]
["Notify"]

["testAPIWhenIsFlagFalse"]
Outside isFlag : false
Outside self: <ProfileVC: 0x7fdd10242a00>
**VisibleVC : <UIAlertController: 0x7fdd1282a000>)**
Display alert : <UIAlertController: 0x7fdd1282a600>
**["Capture Alert : <UIAlertController: 0x7fdd1282a000>"]**
["TAP"]
Inside isFlag : true
Inside self: <ProfileVC: 0x7fdd13818600>
["Join: 3"]
["Join: 4"]
["Notify"]
XCTAssertEqual failed: ("Optional(0)") is not equal to ("Optional(1)")