Swift:使用自定義初始化方法進(jìn)行依賴注入

作者:Natasha The Robot,原文鏈接,原文日期:2016-01-08
譯者:littltedogboy;校對(duì):Cee;定稿:千葉知風(fēng)

作為我今年的第一個(gè)項(xiàng)目,我正在做 @catehstn’s iOS Unit Testing WorkshopSwift 版本。如果感興趣的話,可以在這里注冊(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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容