集合不相等,但该集合中的数组相等吗?

时间:2019-04-04 07:25:51

标签: swift

我使用单元测试,遇到了这个问题: 我有一些类,每个类都有自己的isEqual()方法。在某些时候,我遇到了单元测试有时失败有时成功的情况。

我检查包含一组对象的两个对象的相等性。这里出现了问题。有时测试“ obj1.mySet == obj2.mySet”失败-有时没有。我在每个集合(mySet)中仅使用一个对象进行测试。此对象(在mySet中)本身是否相等的测试成功。

我尝试了几个小时才发现自己的代码有错误,但找不到任何错误。现在,我有一个解决方法可以帮助通过测试,但是我不知道发生了什么。我在测试对象中有一个方法,该方法将集合的对象作为(有序)数组返回。当我测试这些数组的相等性时,测试始终会成功。

有人知道发生了什么事吗?

更新:

在我的BaseClass中

func hash(into hasher: inout Hasher) { hasher.combine(firebaseID) }
static func == (lhs: FirebaseObject, rhs: FirebaseObject) -> Bool { return lhs.isEqual(to: rhs) }
func isEqual(to object: Any?) -> Bool {
        guard object != nil && object is FirebaseObject else { return false }
        let value = object as! FirebaseObject
        return firebaseID == value.firebaseID && name == value.name
    }

在子类中

override func isEqual(to object: Any?) -> Bool {
        guard object != nil && object! is MealPlanned else { return false }
        let obj = object as! MealPlanned

        var result = ""
        if !super.isEqual(to:obj)           { result.append("fbObject ") }
        if portions != obj.portions         { result.append("portions ") }
        if imgID != obj.imgID               { result.append("imgID ") }
        if meal != obj.meal                 { result.append("meal ") }
        if date != obj.date                 { result.append("date ") }
        if portionsInBaseMeal != obj.portionsInBaseMeal             {result.append("portionsInBaseMeal ") }
        if getIngrediencesInMeals() != obj.getIngrediencesInMeals() { result.append("ingrediencesInMeals ") }


        if result.count > 0 {
            if (showsDifference) { print("difference in MealPlanned <\(obj.name ?? "Fehler")>: \(result)") }
            return false
        }
        return true
    }

我这样做是为了查找并打印问题。

此版本成功。

if getIngrediencesInMeals() != obj.getIngrediencesInMeals() { result.append("ingrediencesInMeals ") 

getIngrediencesInMeals()将集合作为有序数组返回。

这样,测试有时成功有时失败:

if ingrediences != ingrediences { result.append("ingrediencesInMeals ") 

这将返回有序数组:

func getIngrediencesInMeals() -> [IngredienceInMeals]   { return ingrediences.sorted{ $0.position < $1.position } }

IngredienceInMeals

override func isEqual(to object: Any?) -> Bool {
        guard object != nil && object! is IngredienceInMeals else { return false }
        let obj = object as! IngredienceInMeals

        var result = ""
        if !super.isEqual(to:obj)           { result.append("fbObject ")}
        if unit != obj.unit                 { result.append("unit ")}
        if quantity != obj.quantity         { result.append("quantity ")}
        if ingredience != obj.ingredience   { result.append("ingredience ")}
        if position != obj.position         { result.append("position ")}
        if result.count > 0 {
            if (showsDifference) { print("difference in IngredienceInMeal <\(obj.name ?? "Fehler")>: \(result)") }
            return false
        }
        return true
    }

1 个答案:

答案 0 :(得分:0)

如果要比较两个对象,请在对象类中使用 Equatable协议 方法

比较两个对象的示例

    class ItemModel : Equatable {

    var TypeOfOffer : String?
    var TypeOfSelling : String?
    var Address : String?
    var NumberOfRoom : String?
    var Price : String?
    var Image : String?
    var ID : String?
    var itemId : String?


    init(TypeOfOffer : String? , TypeOfSelling : String?, Address : String?, NumberOfRoom : String? , Price : String?, Image : String?, ID : String?, itemId : String?  )
    {
        self.TypeOfOffer = TypeOfOffer
        self.TypeOfSelling = TypeOfSelling
        self.Address = Address
        self.NumberOfRoom = NumberOfRoom
        self.Price = Price
        self.Image = Image
        self.ID = ID
        self.itemId = itemId
    }

    static func == (lhs: ItemModel, rhs: ItemModel) -> Bool {
        var isIt = true
        isIt = (lhs.TypeOfOffer == "" || lhs.TypeOfOffer == rhs.TypeOfOffer)
        && (lhs.TypeOfSelling == "" || lhs.TypeOfSelling == rhs.TypeOfSelling)
        && (lhs.Address == "" || lhs.Address == rhs.Address)
        && (lhs.NumberOfRoom == "" || lhs.NumberOfRoom == rhs.NumberOfRoom)
        && (lhs.Price == "" || lhs.Price == rhs.Price)

        return isIt
    }



}

Compare two instances of an object in Swift!