2016-11-25 8 views
0

Я пытаюсь проверить, что два элемента, которые я храню, одинаковы. Однако во время тестирования я получаю сообщение об ошибке при проверке свойства 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. Возможно, это может быть ключом к выяснению проблемы.

+0

С помощью 'XCTAssertEqual' вы можете проверить равенство адресов объектов. Но ваши 'item' и' testItem' не совпадают. –

+0

@ArtemNovichkov, обратите внимание, что, поскольку я говорю, что все одно и то же, но свойство 'tiemestamp', и я не знаю, почему, поскольку я использую' 1456095600.0' для создания обоих. Собственно, обратите внимание, что 'item' равно 1456030800.0, а' testItem' - 1456095600.0. Я не знаю, почему значение элемента меняется. – lmiguelvargasf

+0

и btw @ArtemNovichkov, я думал, что вы можете проверить равенство всякий раз, когда класс реализует протокол «Equatable», и мой класс Item. – lmiguelvargasf

ответ

1

После вашей линии:

let dateFormatter = DateFormatter() 

Попробуйте это:

dateFormatter.timeZone = TimeZone(secondsFromGMT: 64800) 

Если это не сработает, попробуйте:

dateFormatter.timeZone = TimeZone(secondsFromGMT: -64800) 

:-)

Но вы 're вид победить цель единичного теста, если yo вы просто взламываете его до прохода. Вам действительно нужно понять, показывает ли сейчас testItem или item правильное поведение, и это будет зависеть от вашего приложения.

+0

Я пробовал оба, но никто не работал. Когда я попробовал первый, все еще есть разница в шесть часов. Я пробовал добавить 6 часов, но теперь у меня есть разница в 18 часов. – lmiguelvargasf

+0

Я даже попытался изменить местоположение, но опять же не решил. – lmiguelvargasf

1

В FUNC test_Save_UsesGeocoderToGetCoordinateFromAddress() метка времени преобразования в sut.dateTextField.text, затем В SUT.save() sut.dateTextField.text преобразовать в метку времени, минуты и секунды капли