【问题标题】:How can we write Unit Test Case for the function in swift ios我们如何在swift ios中为函数编写单元测试用例
【发布时间】:2021-12-01 15:27:02
【问题描述】:

我想为视图控制器中的委托方法之一的方法编写一个单元测试用例。我为 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.
   }
}

【问题讨论】:

  • 您编写单元测试方法来验证预期的行为,那么您需要在这里验证的行为是什么?另请注意,要编写单元测试,代码必须是可测试的,这主要意味着允许注入依赖项。在这里,如果您要测试的行为是,当您调用该方法时,PremiumFeedbackViewController 是使用 decesiontreeCoordinator 呈现的,那么只需在控制器中注入一个 Spy decesiontreeCoordinator 然后调用该方法,然后检查是否使用预期类型调用了当前方法控制器。
  • @ChristosKoninis 我没有遗漏一些东西来正确测试它,你能提供这次有用的答案吗?
  • 正如我之前所写,我需要知道您需要先使用单元测试方法测试的行为,然后才能提供更详细的示例
  • @ChristosKoninis 用我尝试过的行为更新了问题,你可以看看并告诉我。
  • @ChristosKoninis 能否提供解释答案等待您的回复。

标签: ios swift xcode unit-testing xctestcase


【解决方案1】:

在您的应用程序中重构 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")
   }
}

【讨论】:

  • 谢谢它的工作。
猜你喜欢
  • 2017-05-29
  • 2023-02-15
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 2017-05-29
  • 1970-01-01
相关资源
最近更新 更多