2016-11-25 15 views
0

私が保管している2つのアイテムが同じであることを確認しようとしています。しかし、テスト中に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(タイトル: "フー"、itemDescription:オプション(" バズ」)、タイムスタンプ:オプション(1456030800.0 )、):)) ")が("オプション(ToDo.Location)(オプション:ToDo。 ToDoItem(タイトル: "Foo"、itemDescription:オプション( "Baz")、タイムスタンプ:オプション(1456095600.0)、場所:オプション(ToDo.Location(名前: "Bar"、座標:Optional(__ C.CLLocationCoordinate2D(緯度:37.331685100000001、経度:-122.03006739999999)))))) -

明らかにわかるように、タイムスタンプは両方で同じではなく、なぜそれが変化しているのかわかりません。

EDIT: @ganzogoが見つかりましたので、この間にも正確に18時間の違いがあります。私はGTM-5であるエクアドルに住んでいます。おそらく、これは問題を理解する手がかりになる可能性があります。あなたの行の後

+0

オブジェクトのアドレスが等しいかどうかをチェックすることができます。しかし、あなたの 'item'と' testItem'は同じではありません。 –

+0

@ArtemNovichkov、私はすべてが同じだが、 'tiemestamp'プロパティと同じだと言っています。なぜなら私は' 1456095600.0'を使って両方を作成しているからです。実際には、 'item'は1456030800.0であり、' testItem'は1456095600.0です。私はなぜアイテムの価値が変化しているのか分かりません。 – lmiguelvargasf

+0

とbtw @ArtemNovichkov、私はあなたがクラス 'Equatable'を実装しているクラスがいつでも同等であることを確認できたと思っていました。 – lmiguelvargasf

答えて

1

let dateFormatter = DateFormatter() 

がこれを試し:

dateFormatter.timeZone = TimeZone(secondsFromGMT: -64800) 

。:-)

しかし:

dateFormatter.timeZone = TimeZone(secondsFromGMT: 64800) 

をそれが動作しない場合は、試しますユニットテストの目的を破っているのかなあなたは合格するまでそれをハッキングしています。 testItemまたはitemが現在正しく動作しているかどうかを理解する必要があります。これはアプリケーションによって異なります。

+0

私は両方を試しましたが、うまくいきませんでした。私が最初のものを試したときにはまだ6時間の違いがあります。私は6時間を追加しようとしましたが、今は18時間の違いがあります。 – lmiguelvargasf

+0

私も場所を変更しようとしましたが、もう一度解決されません。 – lmiguelvargasf

1

FUNCで test_Save_UsesGeocoderToGetCoordinateFromAddress() タイムスタンプは、SUTで 、その後、sut.dateTextField.textに変換します。 sut.dateTextField.text タイムスタンプに変換すると、分と秒がドロップされます

関連する問題