繁体   English   中英

我们如何为swift ios中的函数编写单元测试用例

[英]How can we write Unit Test Case for the function in swift ios

我想为视图控制器中的委托方法之一的方法编写单元测试用例。 我为 VC 创建了一个单元测试用例类,并尝试为该方法编写单元测试。

这是在VC中实现的方法。 我们如何编写单元测试用例?

extension DownloadBaseViewController:EMPDecisionTreeCoordinatorDelegate {
    func decisionEmptyTreeFeedbackButtonTapped() {
        if let feedbackNavVc = storyboard?.instantiateViewController(identifier: "PremiumFeedbackNavViewController") as? PremiumCustomNavigationController {
            if let feedbackVc = feedbackNavVc.children.first as? PremiumFeedbackViewController {
                feedbackVc.id = self.fileDetails?.id
                self.decesiontreeCoordinator!.rootViewController.present(feedbackNavVc, animated: true, completion: nil)
            }
        }
    }
}

为 VC 创建了一个单元测试类,并尝试无法正确编写它,遵循一些未找到委托方法的教程。

import XCTest


class DownloadBaseViewControllerTests: XCTestCase {
   
   var downloadBaseViewController: DownloadBaseViewController!
   
   func testDecisionEmptyTreeFeedbackButtonTapped() throws { 
       let feedbackVCNavigation = downloadBaseViewController.decisionEmptyTreeFeedbackButtonTapped
       XCTAssertNotNil(feedbackVCNavigation, "Download base view controller contains feedback view controller and succesfully able to navigate")
 
 ///Test case Build succeded but this is not the way to test it properly need heads up on this.
   }

   override func setUpWithError() throws {
       // Put setup code here. This method is called before the invocation of each test method in the class.
   }
}

在您的应用程序中重构DownloadBaseViewController ,以便您可以模拟依赖项:

extension DownloadBaseViewController:EMPDecisionTreeCoordinatorDelegate {
    // Add this variable in DownloadBaseViewController
    lazy var presentingController: ViewControllerPresenting? = self.decesiontreeCoordinator?.rootViewController

    func decisionEmptyTreeFeedbackButtonTapped() {
        if let feedbackNavVc = storyboard?.instantiateViewController(identifier: "PremiumFeedbackNavViewController") as? PremiumCustomNavigationController {
            if let feedbackVc = feedbackNavVc.children.first as? PremiumFeedbackViewController {
                feedbackVc.id = self.fileDetails?.id
                self.presentingController?.present(feedbackNavVc, animated: true, completion: nil)
            }
        }
    }
}

 // You need this to mock the foreign dependency on UIViewController 
 protocol ViewControllerPresenting: AnyObject {
    func present(_ viewControllerToPresent: UIViewController,
                 animated flag: Bool,
                 completion: (() -> Void)?)
}

extension UIViewController: ViewControllerPresenting {}

在测试中,您注入了一个 Spy 对象,它将帮助您验证正确的行为:

final class UIViewControllerSpy: ViewControllerPresenting {
    var viewControllerToPresent: UIViewController!

    func present(_ viewControllerToPresent: UIViewController,
                 animated flag: Bool,
                 completion: (() -> Void)? = nil) {
        self.viewControllerToPresent = viewControllerToPresent
    }
}

class DownloadBaseViewControllerTests: XCTestCase {

   var downloadBaseViewController: DownloadBaseViewController! = DownloadBaseViewController()

   func testDecisionEmptyTreeFeedbackButtonTapped() throws {
       // Given
       let spyController = UIViewControllerSpy()
       downloadBaseViewController.presentingController = spyController
       // When
       downloadBaseViewController.decisionEmptyTreeFeedbackButtonTapped()
       // Then
       let presentedController = spyController.viewControllerToPresent as? PremiumFeedbackViewController
       XCTAssertNotNil(presentedController, "Download base view controller contains feedback view controller and succesfully able to navigate")
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM