2016-11-15 63 views
0

我在尋找良好做法的建議,迅速測試對象Equatable測試斯威夫特

的平等。如果我有很多特性的複合物很容易錯過平等的實現。

執行平等實施的最佳實踐是什麼?

更多詳細信息: 當然,你可以編寫測試來檢查兩個值是否相等,但這裏的問題是這個問題很容易中斷。 您的項目中有一個結構,六個月後另一位開發人員將該屬性添加到該結構中。 假設他忘記將屬性添加到平等。平等仍然有效,測試通過,但只有該屬性更改時,您的應用纔會中斷。我的問題是,有一種方法可以避免這個問題?

在一個非平凡的應用程序中,最終容易產生具有10個值的模型對象,並使用嵌套的模型對象。那麼我怎樣才能控制我的模型對象的平等呢?如何減少平等執行中的人爲錯誤風險?

可能的解決方案: 一個解決方案,我心目中是寫一個腳本,看起來在編譯時類和結構符合某個協議

Diffable : Equatable {} 

對於所有的類/結構是採用Diffable我會檢查測試文件是否存在等,即:

對於類Foo我會找一個測試類Foo_Tests_Diffable

比內Foo我會檢查測試功能是否存在等符合下列名稱模式的所有屬性

test<property name>Diffable

即:

class Foo : Diffable { 
    var title: String 
    var color: UIColor 
    var tag: Tag 
} 

我會檢查Foo_Tests_Diffable

func testTitleDiffable { 
// Test 
} 

func testColorDiffable { 
// Test 
} 

func testTagDiffable { 
// Test 
} 

如果所有的腳本fin DS都比編譯步驟通預期的測試,否則失敗

但是這種解決方案它的耗時和我不知道如果我能實現它,所以任何的建議是值得歡迎的

+0

嗯,這就是爲什麼你要添加的測試,對不對? ;)如果在所有字段相等的情況下它應該被認爲是相等的,那麼將它聲明爲'struct'是一個好習慣。 – redent84

+0

當然,你可以編寫測試來檢查兩個值是否相等,但這裏的問題是這可能很容易中斷。 您的項目中有一個結構,六個月後另一位開發人員將該屬性添加到該結構中。假設他忘記將這個財產加入平等。平等仍然有效,測試通過,但只有該屬性更改時,您的應用纔會中斷。 我的問題是,有一種方法可以避免這個問題? –

+0

請擴大您的問題標題和正文,以將您的評論納入考慮範圍。出於某種原因,評論對我來說是隱藏的,我寫了一個對你沒用的答案。 – CloakedEddy

回答

0

我將創建專門爲此目的的單元測試

class YourObjectEquatableTests: XCTestCase 
{ 
    func testPropertyOne() 
    { 
     var object1 = /* ... */ 
     var object2 = /* ... */ 

     object1.propertyOne = nil 
     object2.propertyOne = nil 

     XCTAssertEqual(object1, object2) 
     object1.propertyOne = "different value" 
     XCTAssertNotEqual(object1, object2) 

     /* etcetera */ 
    } 

    func testPropertyTwo() 
    { 
     /* ... */ 
    } 
} 

注意:如果實施Equatable細節之前編寫測試用例,你實際上在做TDD這是非常酷!

+0

謝謝,但正如我在我的問題的評論中寫的。我的問題是我想要「將來」更改到類或結構。 如果您在六個月內添加一個房產,我們如何才能發現需要更新平等的事實 –

0

我沒有嘗試太多,但Swift有反射功能。

https://appventure.me/2015/10/24/swift-reflection-api-what-you-can-do/

所以你的情況,你可以反映一個類,然後把一些條件,在您的測試。

例如,您可以爲測試中的類設置修復號或屬性或方法。

let nbAttributes = 6 

,然後檢查:

aMirror.children.count 

我在操場上寫了一個簡單的例子,如果我添加了一個方法變量,孩子們指望增加。我不知道是否可以檢查方法。

class toto{ 
    var io = 9 
    var tutu = "yo" 
    func test(){ 

    } 
} 

let toto1 = toto() 

let aMirror = Mirror(reflecting: toto1) 
aMirror.children.count 

另一個鏈接: Reflection in swift 2

希望幫助:)