iOS 中单元测试的正确方法是什么?

问题描述 投票:0回答:1
class RemoveMyDataConsentFormVCTests: XCTestCase {
    var viewController: RemoveMyDataConsentFormVC!

    override func setUp() {
        super.setUp()
        
        let storyboard = UIStoryboard(name: "RemoveMyDataConsentForm", bundle: nil) // Replace "Main" with your storyboard name
        viewController = storyboard.instantiateViewController(withIdentifier: "RemoveMyDataConsentFormVC") as? RemoveMyDataConsentFormVC
        viewController.loadViewIfNeeded()
    }

    override func tearDown() {
        viewController = nil
        super.tearDown()
    }
    
    func testSetupTextFields() {
        if viewController.emailTextField.text == "" {
            viewController.emailTextField.text = nil
        }
                
        XCTAssertNotNil(viewController.emailTextField.text, "Error for email should be hidden")
        XCTAssertTrue((viewController.errorForStates != nil), "Error for email should be hidden")
        XCTAssertTrue((viewController.errorForCountries != nil), "Error for email should be hidden")
        XCTAssertTrue((viewController.errorForLastName != nil), "Error for email should be hidden")
        XCTAssertTrue((viewController.errorForFirstName != nil), "Error for email should be hidden")
    }
}

上面是我的

UIViewController
代码,我为此编写了一个单元测试来设置文本字段。我正在寻找一个示例来改进我使用 Swift 5 编写单元测试的方式。

测试正在通过,但以正确的方式编写单元测试似乎不是一个好的做法。

ios swift unit-testing uiviewcontroller uikit
1个回答
0
投票

有两种常见的测试类型:

  • 我们在

    UI测试
    中测试UI行为(如UIViewController子类)。但是当我们编写这些测试时,我们通常不会检查视图控制器的内部状态,而是测试 UI 中呈现的内容。

    例如,UI 测试将为某些 UI 控件(如文本字段)提供一些值,然后 UI 测试将验证 UI 是否正确反映了错误。但我们不测试内部错误对象,而是测试它在 UI 中的呈现方式。

  • 我们使用单元测试来测试各个方法的行为,而不是用户界面。因此,我们可以编写单元测试来验证给定函数是否返回了预期结果。

    例如,可以验证提供给某些“验证字符串”函数的某些文本字符串是否返回了正确的错误对象。

上面隐含的是我们通常将业务逻辑从视图控制器(它是应用程序 UI 的一部分)中抽象出来。不同的团队/项目使用不同的技术/术语来实现这一点:有些使用“视图模型”。有些使用“演示”对象。有些使用更抽象的“控制器”(不要与特定于 UI 的“视图控制器”混淆)或“服务”对象来封装此业务逻辑。

无论如何实现这一点,我们的想法是,出于可测试性的原因(以及一般良好的设计),我们从代码库的 UI 层中抽象出业务逻辑(即,我们将其从视图控制器中提取出来)。然后我们编写“单元测试”来验证这些业务逻辑功能/对象,与任何 UI 代码完全分开。然后我们编写“UI 测试”来验证我们的 UI 的行为是否符合我们的预期,而不是验证视图层的内部状态。

© www.soinside.com 2019 - 2024. All rights reserved.