Я работаю с юнит-тестами и сталкиваюсь с этой проблемой:
У меня есть несколько классов, и у каждого есть свой метод 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
}