簡體   English   中英

Swift 中的等價測試

[英]Equatable Testing in Swift

我正在尋找有關測試 swift 對象相等性的良好做法的建議

如果我有一個具有許多屬性的復雜對象,很容易錯過相等的實現。

執行平等實施的良好做法是什么?

更多細節:當然,您可以編寫測試來檢查兩個值是否應該相等,但這里的問題是這很容易破壞。 您的項目中有一個結構,六個月后,另一個開發人員向該結構添加了一個屬性。 假設他忘記將屬性添加到等式中。 相等性仍然有效,測試通過,但只有該屬性更改時,您的應用程序才會中斷。 我的問題是,有沒有辦法避免這個問題?

在一個非平凡的應用程序中很容易最終擁有具有 10 個值的模型對象,並使用嵌套的模型對象。 那么我怎樣才能控制我的模型對象的平等呢? 如何降低平等實施中的人為錯誤風險?

可能的解決方案:我想到的一個解決方案是編寫一個腳本,查看符合特定協議的類和結構的編譯時間

Diffable : Equatable {}

對於所有采用Diffable的類/結構,我將檢查測試文件的存在,即:

對於Foo類,我將尋找一個測試類Foo_Tests_Diffable

對於Foo中的所有屬性,我將檢查是否存在符合以下名稱模式的測試函數

test<property name>Diffable

IE:

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

我將在Foo_Tests_Diffable中檢查以下測試

func testTitleDiffable {
// Test
}

func testColorDiffable {
// Test
}

func testTagDiffable {
// Test
}

如果所有腳本都找到了所有預期的測試而不是編譯步驟通過,否則失敗

但是這個解決方案很耗時,我不知道我是否能夠實現它,所以歡迎任何建議

我會專門為此目的創建單元測試

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,這非常酷!

我沒有嘗試很多,但 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

另一個鏈接: swift 2 中的反射

希望有幫助:)

是的,擴展@Mikael 的答案,您可能應該使用反射。

一個例子是:

String(reflecting: obj1) == String(reflecting: obj2)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM