From 18742ddf22dc73853117f9d8b8dd2bc88c59fc86 Mon Sep 17 00:00:00 2001 From: Max Muth Date: Mon, 6 Mar 2017 11:37:36 +0100 Subject: [PATCH 1/5] Update movie test --- TUM Campus AppUnitTests/MovieTests.swift | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/TUM Campus AppUnitTests/MovieTests.swift b/TUM Campus AppUnitTests/MovieTests.swift index 675e4053..e23acdc6 100644 --- a/TUM Campus AppUnitTests/MovieTests.swift +++ b/TUM Campus AppUnitTests/MovieTests.swift @@ -1,4 +1,3 @@ -// // TUM_Campus_AppUnitTests.swift // TUM Campus AppUnitTests // @@ -25,15 +24,15 @@ class MovieTests: XCTestCase { super.tearDown() } - func testGetAllMovies() { - self.testGetAllMoviesExpectation = expectation(description: "Fetch movies and check whether there are > 0 movies") + func testOnlyUpcomingMovies() { + self.testGetAllMoviesExpectation = expectation(description: "Fetch movies and check whether they are all in the future") manager.getMovies(self) waitForExpectations(timeout: 5) { error in // if let error = error { // XCTFail("waitForExpectationsWithTimeout errored: \(error)") // } } - + } } @@ -46,7 +45,11 @@ extension MovieTests: TumDataReceiver { movies.append(movieElement) } } - XCTAssertNotNil(movies) + let dateNow = Date() + let upcomingMovies = movies.filter() { movie in + return movie.airDate >= dateNow + } + XCTAssertTrue(movies.isEmpty || movies.count == upcomingMovies.count) self.testGetAllMoviesExpectation?.fulfill() } From e7e3bdc9b101d365aa69d0abb7d14d834e03235f Mon Sep 17 00:00:00 2001 From: Max Muth Date: Mon, 6 Mar 2017 12:52:36 +0100 Subject: [PATCH 2/5] Add Mock for TumDataReceiver --- TUM Campus AppUnitTests/MovieTests.swift | 61 +++++++++++++----------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/TUM Campus AppUnitTests/MovieTests.swift b/TUM Campus AppUnitTests/MovieTests.swift index e23acdc6..1ee22d75 100644 --- a/TUM Campus AppUnitTests/MovieTests.swift +++ b/TUM Campus AppUnitTests/MovieTests.swift @@ -9,12 +9,22 @@ import XCTest @testable import Campus -class MovieTests: XCTestCase { +class MockReceiver: TumDataReceiver { + var mockReceiveData: (([DataElement], XCTestExpectation) -> Void)? + var expectation: XCTestExpectation? - var movies = [Movie]() - var manager = TumDataManager(user: nil) + init(receiveData: @escaping (([DataElement], XCTestExpectation) -> Void), expectation: XCTestExpectation) { + self.mockReceiveData = receiveData + self.expectation = expectation + } - var testGetAllMoviesExpectation: XCTestExpectation? + func receiveData(_ data: [DataElement]) { + self.mockReceiveData?(data, self.expectation!) + } +} + +class MovieTests: XCTestCase { + var manager = TumDataManager(user: nil) override func setUp() { super.setUp() @@ -25,32 +35,27 @@ class MovieTests: XCTestCase { } func testOnlyUpcomingMovies() { - self.testGetAllMoviesExpectation = expectation(description: "Fetch movies and check whether they are all in the future") - manager.getMovies(self) - waitForExpectations(timeout: 5) { error in -// if let error = error { -// XCTFail("waitForExpectationsWithTimeout errored: \(error)") -// } - } - - } - -} - -extension MovieTests: TumDataReceiver { - - func receiveData(_ data: [DataElement]) { - for element in data { - if let movieElement = element as? Movie { - movies.append(movieElement) + func receiveData(_ data: [DataElement], expectation: XCTestExpectation) { + var movies = [Movie]() + for element in data { + if let movieElement = element as? Movie { + movies.append(movieElement) + } } + let dateNow = Date() + let upcomingMovies = movies.filter() { movie in + return movie.airDate >= dateNow + } + XCTAssertTrue(movies.isEmpty || movies.count == upcomingMovies.count) + expectation.fulfill() } - let dateNow = Date() - let upcomingMovies = movies.filter() { movie in - return movie.airDate >= dateNow - } - XCTAssertTrue(movies.isEmpty || movies.count == upcomingMovies.count) - self.testGetAllMoviesExpectation?.fulfill() + + let expect = expectation(description: "Fetch movies and check whether they are all in the future") + let tmpReceiver = MockReceiver(receiveData: receiveData, expectation: expect) + + manager.getMovies(tmpReceiver) + waitForExpectations(timeout: 5) { error in } + } } From a7e8a29c2bfe8c0e4d0ac91d3418021df1dcb2fd Mon Sep 17 00:00:00 2001 From: Max Muth Date: Mon, 6 Mar 2017 13:06:12 +0100 Subject: [PATCH 3/5] Add message to assertion --- TUM Campus AppUnitTests/MovieTests.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TUM Campus AppUnitTests/MovieTests.swift b/TUM Campus AppUnitTests/MovieTests.swift index 1ee22d75..54f52fb4 100644 --- a/TUM Campus AppUnitTests/MovieTests.swift +++ b/TUM Campus AppUnitTests/MovieTests.swift @@ -10,8 +10,8 @@ import XCTest @testable import Campus class MockReceiver: TumDataReceiver { - var mockReceiveData: (([DataElement], XCTestExpectation) -> Void)? - var expectation: XCTestExpectation? + let mockReceiveData: (([DataElement], XCTestExpectation) -> Void)? + let expectation: XCTestExpectation? init(receiveData: @escaping (([DataElement], XCTestExpectation) -> Void), expectation: XCTestExpectation) { self.mockReceiveData = receiveData @@ -46,7 +46,7 @@ class MovieTests: XCTestCase { let upcomingMovies = movies.filter() { movie in return movie.airDate >= dateNow } - XCTAssertTrue(movies.isEmpty || movies.count == upcomingMovies.count) + XCTAssertTrue(movies.isEmpty || movies.count == upcomingMovies.count, "Movies are all in the future or there are no future movies.") expectation.fulfill() } From 4d537a3f52f02b13d6cdeee3402987b0741d0d7e Mon Sep 17 00:00:00 2001 From: Max Muth Date: Mon, 6 Mar 2017 20:08:46 +0100 Subject: [PATCH 4/5] Refactor test --- TUM Campus App.xcodeproj/project.pbxproj | 4 ++++ TUM Campus AppUnitTests/MockReceiver.swift | 25 ++++++++++++++++++++++ TUM Campus AppUnitTests/MovieTests.swift | 21 +----------------- 3 files changed, 30 insertions(+), 20 deletions(-) create mode 100644 TUM Campus AppUnitTests/MockReceiver.swift diff --git a/TUM Campus App.xcodeproj/project.pbxproj b/TUM Campus App.xcodeproj/project.pbxproj index 9115928a..5f44213e 100644 --- a/TUM Campus App.xcodeproj/project.pbxproj +++ b/TUM Campus App.xcodeproj/project.pbxproj @@ -118,6 +118,7 @@ 50200E261DF4992900B6FBE3 /* LectureDetail.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50200E251DF4992900B6FBE3 /* LectureDetail.storyboard */; }; 504C292C1E2BBB9C007583E2 /* MovieTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504C292B1E2BBB9C007583E2 /* MovieTests.swift */; }; 50AFC9861E6C8ECF00E7886A /* Pods_Campus.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50AFC9851E6C8ECF00E7886A /* Pods_Campus.framework */; }; + 50D1535A1E6DEAC9005EF930 /* MockReceiver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50D153591E6DEAC9005EF930 /* MockReceiver.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -257,6 +258,7 @@ 504C292B1E2BBB9C007583E2 /* MovieTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MovieTests.swift; sourceTree = ""; }; 504C292D1E2BBB9C007583E2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 50AFC9851E6C8ECF00E7886A /* Pods_Campus.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Pods_Campus.framework; path = "../../Library/Developer/Xcode/DerivedData/Campus_App-abdlonhukuicsjbpypswdmfoclts/Build/Products/Debug-iphonesimulator/Pods_Campus.framework"; sourceTree = ""; }; + 50D153591E6DEAC9005EF930 /* MockReceiver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockReceiver.swift; sourceTree = ""; }; B036FEAD3E1DFC9E65802F03 /* Pods-Campus.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Campus.release.xcconfig"; path = "Pods/Target Support Files/Pods-Campus/Pods-Campus.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -637,6 +639,7 @@ 504C292A1E2BBB9C007583E2 /* TUM Campus AppUnitTests */ = { isa = PBXGroup; children = ( + 50D153591E6DEAC9005EF930 /* MockReceiver.swift */, 504C292B1E2BBB9C007583E2 /* MovieTests.swift */, 504C292D1E2BBB9C007583E2 /* Info.plist */, ); @@ -967,6 +970,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 50D1535A1E6DEAC9005EF930 /* MockReceiver.swift in Sources */, 504C292C1E2BBB9C007583E2 /* MovieTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/TUM Campus AppUnitTests/MockReceiver.swift b/TUM Campus AppUnitTests/MockReceiver.swift new file mode 100644 index 00000000..3b36eb19 --- /dev/null +++ b/TUM Campus AppUnitTests/MockReceiver.swift @@ -0,0 +1,25 @@ +// +// MockReceiver.swift +// TUM Campus App +// +// Created by Max Muth on 06.03.17. +// Copyright © 2017 LS1 TUM. All rights reserved. +// + +import XCTest + +@testable import Campus + +class MockReceiver: TumDataReceiver { + let mockReceiveData: (([DataElement], XCTestExpectation) -> Void)? + let expectation: XCTestExpectation? + + init(receiveData: @escaping (([DataElement], XCTestExpectation) -> Void), expectation: XCTestExpectation) { + self.mockReceiveData = receiveData + self.expectation = expectation + } + + func receiveData(_ data: [DataElement]) { + self.mockReceiveData?(data, self.expectation!) + } +} diff --git a/TUM Campus AppUnitTests/MovieTests.swift b/TUM Campus AppUnitTests/MovieTests.swift index 54f52fb4..05e51dcd 100644 --- a/TUM Campus AppUnitTests/MovieTests.swift +++ b/TUM Campus AppUnitTests/MovieTests.swift @@ -9,20 +9,6 @@ import XCTest @testable import Campus -class MockReceiver: TumDataReceiver { - let mockReceiveData: (([DataElement], XCTestExpectation) -> Void)? - let expectation: XCTestExpectation? - - init(receiveData: @escaping (([DataElement], XCTestExpectation) -> Void), expectation: XCTestExpectation) { - self.mockReceiveData = receiveData - self.expectation = expectation - } - - func receiveData(_ data: [DataElement]) { - self.mockReceiveData?(data, self.expectation!) - } -} - class MovieTests: XCTestCase { var manager = TumDataManager(user: nil) @@ -36,12 +22,7 @@ class MovieTests: XCTestCase { func testOnlyUpcomingMovies() { func receiveData(_ data: [DataElement], expectation: XCTestExpectation) { - var movies = [Movie]() - for element in data { - if let movieElement = element as? Movie { - movies.append(movieElement) - } - } + let movies = data.flatMap { $0 as? Movie } let dateNow = Date() let upcomingMovies = movies.filter() { movie in return movie.airDate >= dateNow From 9439cca16d7a57cde5012dee5e0e184b9af0469d Mon Sep 17 00:00:00 2001 From: Max Muth Date: Mon, 6 Mar 2017 20:12:35 +0100 Subject: [PATCH 5/5] Add another movie-test --- TUM Campus AppUnitTests/MovieTests.swift | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/TUM Campus AppUnitTests/MovieTests.swift b/TUM Campus AppUnitTests/MovieTests.swift index 05e51dcd..ef45d299 100644 --- a/TUM Campus AppUnitTests/MovieTests.swift +++ b/TUM Campus AppUnitTests/MovieTests.swift @@ -20,6 +20,20 @@ class MovieTests: XCTestCase { super.tearDown() } + func testReceivedDataAreMovies() { + func receiveData(_ data: [DataElement], expectation: XCTestExpectation) { + let movies = data.flatMap { $0 as? Movie } + XCTAssertTrue(data.count == movies.count, expectation.description) + expectation.fulfill() + } + + let expect = expectation(description: "Received data items can be initialized to movies") + let tmpReceiver = MockReceiver(receiveData: receiveData, expectation: expect) + + manager.getMovies(tmpReceiver) + waitForExpectations(timeout: 5) { error in } + } + func testOnlyUpcomingMovies() { func receiveData(_ data: [DataElement], expectation: XCTestExpectation) { let movies = data.flatMap { $0 as? Movie } @@ -27,16 +41,15 @@ class MovieTests: XCTestCase { let upcomingMovies = movies.filter() { movie in return movie.airDate >= dateNow } - XCTAssertTrue(movies.isEmpty || movies.count == upcomingMovies.count, "Movies are all in the future or there are no future movies.") + XCTAssertTrue(movies.isEmpty || movies.count == upcomingMovies.count, expectation.description) expectation.fulfill() } - let expect = expectation(description: "Fetch movies and check whether they are all in the future") + let expect = expectation(description: "Movies are all in the future or there are no movies") let tmpReceiver = MockReceiver(receiveData: receiveData, expectation: expect) manager.getMovies(tmpReceiver) waitForExpectations(timeout: 5) { error in } - } }