作者:Natasha The Robot,原文鏈接,原文日期:2016-01-08
譯者:littltedogboy;校對(duì):Cee;定稿:千葉知風(fēng)
作為我今年的第一個(gè)項(xiàng)目,我正在做 @catehstn’s iOS Unit Testing Workshop 的 Swift 版本。如果感興趣的話,可以在這里注冊(cè)。
在我寫代碼和測(cè)試期間,我遇到了下面的問題...
假設(shè)我使用 Swift 創(chuàng)建了一個(gè)簡(jiǎn)單的計(jì)數(shù)器:
// Counter.swift
struct Counter {
// `count` 在這里為一個(gè)變量
// 但是我不想把 `count` 設(shè)置為外部可訪問的
// 因此我把 `count` 設(shè)置為私有的(這里有小提示!https://twitter.com/mipstian/status/685489964403003393)
private(set) var count: Int
init() {
// 我想讓計(jì)數(shù)器默認(rèn)從 0 開始
count = 0
}
// 我只想讓 `count` 通過此函數(shù)被修改
// 通過像這樣的函數(shù)
mutating func increment() {
count += 1
}
}
這個(gè)結(jié)構(gòu)體超級(jí)簡(jiǎn)單,我也很容易地編寫了一個(gè) increment 測(cè)試用例。
// CounterTests.swift
import XCTest
@testable import Counter
class CounterTests: XCTestCase {
func testIncrement() {
var counter = Counter()
XCTAssertEqual(counter.count, 0)
counter.increment()
XCTAssertEqual(counter.count, 1)
}
}
測(cè)試正確,但是下面這種情況呢!
// Counter.swift
struct Counter {
private(set) var count: Int
init() {
count = 0
}
// 代碼縮減 (見上面)
// 當(dāng)用戶進(jìn)行內(nèi)購(gòu)
// 提升了他們的分?jǐn)?shù)!
mutating func scaleBy(multiplier: Int) {
count = count * multiplier
}
}
因?yàn)?Counter 的值初始化為 0,乘法測(cè)試沒有效果。
// CounterTests.swift
class CounterTests: XCTestCase {
func testScaleBy() {
var counter = Counter()
XCTAssertEqual(counter.count, 0)
counter.scaleBy(5)
// 正如我們所知,scaleBy 可以做多次乘法運(yùn)算和除法運(yùn)算
// 要么只是返回 count ,要么只是返回 0
XCTAssertEqual(counter.count, 0)
}
}
為了進(jìn)行有效的測(cè)試,我們需要在 count 不為 0 的情況下測(cè)試我們的 scaleBy 方法,所以我們需要控制計(jì)數(shù)器的初始值。我們可以使用默認(rèn)值和正確的初始值注入 init 函數(shù)(譯者注:作者這里的意思是,如果初始化的時(shí)候,不給 init 函數(shù)參數(shù),則使用默認(rèn)值;反之則使用給定的初始值。):
// Counter.swift
struct Counter {
private(set) var count: Int
// 依賴注入
// 計(jì)數(shù)器的初始值是注入的
init(count: Int = 0) {
self.count = count
}
mutating func scaleBy(multiplier: Int) {
count = count * multiplier
}
}
現(xiàn)在測(cè)試如下!
// CounterTests.swift
class CounterTests: XCTestCase {
func testScaleBy() {
// 這次計(jì)數(shù)器從一個(gè)不為零的值開始
var counter = Counter(count: 5)
XCTAssertEqual(counter.count, 5)
counter.scaleBy(5)
XCTAssertEqual(counter.count, 25)
}
}
就是這樣!通過添加一個(gè)初始值是我們想要的初始化函數(shù),我們保持了計(jì)數(shù)器的完整性,該函數(shù)的作用是編寫有效的測(cè)試!
本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán),最新文章請(qǐng)?jiān)L問 http://swift.gg。