【问题标题】:Can anyone give me an example about unit testing in iOS Swift?谁能给我一个关于 iOS Swift 单元测试的例子吗?
【发布时间】:2019-05-02 07:22:55
【问题描述】:

我是 iOS 开发新手,想学习单元测试。我想使用文本字段添加两个数字,并在单击操作时在标签中显示结果。谁能建议我如何为此进行单元测试?

【问题讨论】:

  • 计算是UnitTested,动作+表现是UITest
  • 既然你说的是一个由多个单元组成并且不能真正被模拟的东西(UIKit),所以不可能 unit 测试它。您需要集成/e2e 测试。

标签: ios swift unit-testing


【解决方案1】:

这是一个简短的示例,但您应该始终尝试多种不同的变体,就好像它是文本而不是数字和负数、高于 int 的数字等...

class AddingViewController: UIViewController {

    var sum = 0

    let textField1 = UITextField()
    let textField2 = UITextField()
    let button = UIButton()
    override func viewDidLoad() {
        super.viewDidLoad()
        button.addTarget(self, action: #selector(addNumbers), for: .touchUpInside)
    }

    @objc func addNumbers() {
        guard let number1 = Int(textField1.text!), let number2 = Int(textField2.text!) else {
            return
        }
        sum = number1 + number2
    }
}

class TestAddingViewController {

    let vc = AddingViewController()

    func testAddNumbers() {
        let number1 = 1
        let number2 = 2
        let sum = number1 + number2
        vc.textField1.text = "\(number1)"
        vc.textField2.text = "\(number2)"
        vc.button.sendActions(for: .touchUpInside)
        XCTAssertEqual(sum, vc.sum)
    }
}

如果 viewController 来自 storyboard,你可以像通常调用 storyboard viewControllers 一样调用它

let storyboard = UIStoryboard(name: "MyStoryboardName", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "someViewController")

文本字段 + 按钮将是 @outlets,按钮操作将是 @IBAction 而不是 @objc func

【讨论】:

  • 从情节提要加载文本字段后会是什么样子?
  • 也针对故事板方法进行了编辑
【解决方案2】:

这是我的视图控制器类:

import UIKit

class ViewController: UIViewController {

   // MARK: ▼▼▼ IBOutlets ▼▼▼
   @IBOutlet weak var lblAnswer: UILabel!

   // MARK: ▼▼▼ Lifecycle methods ▼▼▼
   override func viewDidLoad() {
      super.viewDidLoad()
      lblAnswer.text = "\(calculateSum(num1: 5, num2: 10))"
   }

   // MARK: ▼▼▼ Methods ▼▼▼
   func calculateSum(num1: Int, num2: Int) -> Int {
      return (num1 + num2)
   }
}

对于单元测试类我有:

import XCTest
@testable import Test

class TestTests: XCTestCase {

// MARK: ▼▼▼ Variables ▼▼▼
var num1: Int?
var num2: Int?
var testClass: ViewController?

// This is used to initialise your code:
override func setUp() {
    testClass = ViewController()
    num1 = 10
    num2 = 10
}

// This runs when test is complete:
override func tearDown() {
    testClass = nil
    num1 = nil
    num2 = nil
}

// Should begin with test so that it is recognised:
func testSumFunction() {
    let sum = testClass!.calculateSum(num1: num1!, num2: num2!)
    // The sum should be 20 for this to pass.
    XCTAssertTrue(sum == 20)
}
}

如果函数的逻辑发生变化并且答案不等于20,那么这个测试将失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2011-02-28
    • 2013-06-06
    • 1970-01-01
    • 2023-03-24
    • 2020-09-19
    • 1970-01-01
    相关资源
    最近更新 更多