Набор не равен, но массив из этого набора равен? - PullRequest
0 голосов
/ 04 апреля 2019

Я работаю с юнит-тестами и сталкиваюсь с этой проблемой: У меня есть несколько классов, и у каждого есть свой метод isEqual (). В какой-то момент я попал в ситуацию, когда юнит-тест иногда дает сбой, а иногда и успешно.

Я проверяю равенство двух объектов, которые содержат набор объектов. Здесь возникает проблема. Иногда тест "obj1.mySet == obj2.mySet" не проходит - иногда нет. Я проверяю это только с одним объектом в каждом наборе (mySet). Проверка на равенство этих объектов (в mySet) сама по себе проходит успешно.

Я несколько часов пытался найти ошибку в своем коде, но не смог ее найти. Теперь у меня есть обходной путь, который помогает пройти тест, но я не понимаю, что происходит. У меня есть метод внутри test-objects, который возвращает объекты набора в виде (упорядоченного) массива. Когда я проверяю равенство этих массивов, проверка всегда проходит успешно.

Кто-нибудь знает, что происходит?

Обновление:

В моем 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 голосов
/ 04 апреля 2019

, если вы хотите сравнить два объекта, используйте равноправный протокол метод в вашем классе объектов

пример сравнения двух объектов

    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
    }



}

Сравните два экземпляра объекта в Swift!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...