Я пытаюсь проверить, что два элемента, которые я храню, одинаковы. Однако во время тестирования я получаю сообщение об ошибке при проверке свойства Date.Тестирование не выполняется при утверждении дат
Примечание: мой класс Item реализует протокол Equatable
.
Это мой метод установки:
class InputViewControllerTests: XCTestCase {
var sut: InputViewController!
var placemark: MockPlacemark!
override func setUp() {
super.setUp()
let storyboard = UIStoryboard(name: "Main",
bundle: nil)
sut = storyboard
.instantiateViewController(
withIdentifier: "InputViewController")
as! InputViewController
_ = sut.view
}
}
Это расширение моего тестового класса:
extension InputViewControllerTests {
class MockGeocoder: CLGeocoder {
var completionHandler: CLGeocodeCompletionHandler?
override func geocodeAddressString(
_ addressString: String,
completionHandler: @escaping CLGeocodeCompletionHandler) {
self.completionHandler = completionHandler
}
}
class MockPlacemark : CLPlacemark {
var mockCoordinate: CLLocationCoordinate2D?
override var location: CLLocation? {
guard let coordinate = mockCoordinate else
{ return CLLocation() }
return CLLocation(latitude: coordinate.latitude,
longitude: coordinate.longitude)
}
}
}
Это мой тест:
func test_Save_UsesGeocoderToGetCoordinateFromAddress() {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MM/dd/yyyy"
let timestamp = 1456095600.0
let date = Date(timeIntervalSince1970: timestamp)
sut.titleTextField.text = "Foo"
sut.dateTextField.text = dateFormatter.string(from: date)
sut.locationTextField.text = "Bar"
sut.addressTextField.text = "Infinite Loop 1, Cupertino"
sut.descriptionTextField.text = "Baz"
let mockGeocoder = MockGeocoder()
sut.geocoder = mockGeocoder
sut.itemManager = ItemManager()
sut.save()
placemark = MockPlacemark()
let coordinate = CLLocationCoordinate2DMake(37.3316851,
-122.0300674)
placemark.mockCoordinate = coordinate
mockGeocoder.completionHandler?([placemark], nil)
let item = sut.itemManager?.item(at: 0)
let testItem = ToDoItem(title: "Foo",
itemDescription: "Baz",
timestamp: timestamp,
location: Location(name: "Bar",
coordinate: coordinate))
XCTAssertEqual(item, testItem)
}
Это реализация save()
:
class InputViewController: UIViewController {
// ...
@IBAction func save() {
guard let titleString = titleTextField.text,
titleString.characters.count > 0 else { return }
let date: Date?
if let dateText = self.dateTextField.text,
dateText.characters.count > 0 {
date = dateFormatter.date(from: dateText)
} else {
date = nil
}
let descriptionString = descriptionTextField.text
if let locationName = locationTextField.text,
locationName.characters.count > 0 {
if let address = addressTextField.text,
address.characters.count > 0 {
geocoder.geocodeAddressString(address) {
[unowned self] (placeMarks, error) -> Void in
let placeMark = placeMarks?.first
let item = ToDoItem(
title: titleString,
itemDescription: descriptionString,
timestamp: date?.timeIntervalSince1970,
location: Location(
name: locationName,
coordinate: placeMark?.location?.coordinate))
self.itemManager?.add(item)
}
}
}
}
}
У меня возникли проблемы с попыткой выяснить, что не так с этим. Ошибка я получаю:
test_Save_UsesGeocoderToGetCoordinateFromAddress()] не удалось: XCTAssertEqual не удалось: ("Дополнительно (ToDo.ToDoItem (название: "Foo", itemDescription: Необязательно (" Баз "), метка времени: Опционно (+1456030800,0), местоположение: необязательно (ToDo.Location (имя: «Бар», координата: необязательно (__ C.CLLocationCoordinate2D (широта: 37.331685100000001, долгота: -122.03006739999999)))))) ») не равно (« Необязательно (ToDo. ToDoItem (название: «Foo», itemDescription: Необязательный («Baz»), временная метка: необязательно (1456095600.0), местоположение: необязательно (ToDo.Location (имя: «Бар», координата: необязательно (__ C.CLLocationCoordinate2D (широта: 37.331685100000001, долгота: -122.03006739999999)))))) ") -
Как видно, проблема в том, что временная метка не одинакова для обоих, и я понятия не имею, почему она меняется.
EDIT: Как найдено @ganzogo, между этими слишкомстями разница составляет ровно 18 часов. Я живу в Эквадоре, который является GTM-5. Возможно, это может быть ключом к выяснению проблемы.
С помощью 'XCTAssertEqual' вы можете проверить равенство адресов объектов. Но ваши 'item' и' testItem' не совпадают. –
@ArtemNovichkov, обратите внимание, что, поскольку я говорю, что все одно и то же, но свойство 'tiemestamp', и я не знаю, почему, поскольку я использую' 1456095600.0' для создания обоих. Собственно, обратите внимание, что 'item' равно 1456030800.0, а' testItem' - 1456095600.0. Я не знаю, почему значение элемента меняется. – lmiguelvargasf
и btw @ArtemNovichkov, я думал, что вы можете проверить равенство всякий раз, когда класс реализует протокол «Equatable», и мой класс Item. – lmiguelvargasf