Skip to content

Commit a119271

Browse files
committed
Replace try! with throwing test methods
`try!` can cause crashes, which stops the test execution. When possible, it's best to throw errors in test methods, so you get a failing test rather than a crash.
1 parent 0fbdd1a commit a119271

4 files changed

Lines changed: 80 additions & 84 deletions

File tree

EssentialFeed/EssentialFeedCacheIntegrationTests/EssentialFeedCacheIntegrationTests.swift

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,26 @@ class EssentialFeedCacheIntegrationTests: XCTestCase {
2121

2222
// MARK: - LocalFeedLoader Tests
2323

24-
func test_loadFeed_deliversNoItemsOnEmptyCache() {
25-
let feedLoader = makeFeedLoader()
24+
func test_loadFeed_deliversNoItemsOnEmptyCache() throws {
25+
let feedLoader = try makeFeedLoader()
2626

2727
expect(feedLoader, toLoad: [])
2828
}
2929

30-
func test_loadFeed_deliversItemsSavedOnASeparateInstance() {
31-
let feedLoaderToPerformSave = makeFeedLoader()
32-
let feedLoaderToPerformLoad = makeFeedLoader()
30+
func test_loadFeed_deliversItemsSavedOnASeparateInstance() throws {
31+
let feedLoaderToPerformSave = try makeFeedLoader()
32+
let feedLoaderToPerformLoad = try makeFeedLoader()
3333
let feed = uniqueImageFeed().models
3434

3535
save(feed, with: feedLoaderToPerformSave)
3636

3737
expect(feedLoaderToPerformLoad, toLoad: feed)
3838
}
3939

40-
func test_saveFeed_overridesItemsSavedOnASeparateInstance() {
41-
let feedLoaderToPerformFirstSave = makeFeedLoader()
42-
let feedLoaderToPerformLastSave = makeFeedLoader()
43-
let feedLoaderToPerformLoad = makeFeedLoader()
40+
func test_saveFeed_overridesItemsSavedOnASeparateInstance() throws {
41+
let feedLoaderToPerformFirstSave = try makeFeedLoader()
42+
let feedLoaderToPerformLastSave = try makeFeedLoader()
43+
let feedLoaderToPerformLoad = try makeFeedLoader()
4444
let firstFeed = uniqueImageFeed().models
4545
let latestFeed = uniqueImageFeed().models
4646

@@ -50,9 +50,9 @@ class EssentialFeedCacheIntegrationTests: XCTestCase {
5050
expect(feedLoaderToPerformLoad, toLoad: latestFeed)
5151
}
5252

53-
func test_validateFeedCache_doesNotDeleteRecentlySavedFeed() {
54-
let feedLoaderToPerformSave = makeFeedLoader()
55-
let feedLoaderToPerformValidation = makeFeedLoader()
53+
func test_validateFeedCache_doesNotDeleteRecentlySavedFeed() throws {
54+
let feedLoaderToPerformSave = try makeFeedLoader()
55+
let feedLoaderToPerformValidation = try makeFeedLoader()
5656
let feed = uniqueImageFeed().models
5757

5858
save(feed, with: feedLoaderToPerformSave)
@@ -61,9 +61,9 @@ class EssentialFeedCacheIntegrationTests: XCTestCase {
6161
expect(feedLoaderToPerformSave, toLoad: feed)
6262
}
6363

64-
func test_validateFeedCache_deletesFeedSavedInADistantPast() {
65-
let feedLoaderToPerformSave = makeFeedLoader(currentDate: .distantPast)
66-
let feedLoaderToPerformValidation = makeFeedLoader(currentDate: Date())
64+
func test_validateFeedCache_deletesFeedSavedInADistantPast() throws {
65+
let feedLoaderToPerformSave = try makeFeedLoader(currentDate: .distantPast)
66+
let feedLoaderToPerformValidation = try makeFeedLoader(currentDate: Date())
6767
let feed = uniqueImageFeed().models
6868

6969
save(feed, with: feedLoaderToPerformSave)
@@ -74,10 +74,10 @@ class EssentialFeedCacheIntegrationTests: XCTestCase {
7474

7575
// MARK: - LocalFeedImageDataLoader Tests
7676

77-
func test_loadImageData_deliversSavedDataOnASeparateInstance() {
78-
let imageLoaderToPerformSave = makeImageLoader()
79-
let imageLoaderToPerformLoad = makeImageLoader()
80-
let feedLoader = makeFeedLoader()
77+
func test_loadImageData_deliversSavedDataOnASeparateInstance() throws {
78+
let imageLoaderToPerformSave = try makeImageLoader()
79+
let imageLoaderToPerformLoad = try makeImageLoader()
80+
let feedLoader = try makeFeedLoader()
8181
let image = uniqueImage()
8282
let dataToSave = anyData()
8383

@@ -87,11 +87,11 @@ class EssentialFeedCacheIntegrationTests: XCTestCase {
8787
expect(imageLoaderToPerformLoad, toLoad: dataToSave, for: image.url)
8888
}
8989

90-
func test_saveImageData_overridesSavedImageDataOnASeparateInstance() {
91-
let imageLoaderToPerformFirstSave = makeImageLoader()
92-
let imageLoaderToPerformLastSave = makeImageLoader()
93-
let imageLoaderToPerformLoad = makeImageLoader()
94-
let feedLoader = makeFeedLoader()
90+
func test_saveImageData_overridesSavedImageDataOnASeparateInstance() throws {
91+
let imageLoaderToPerformFirstSave = try makeImageLoader()
92+
let imageLoaderToPerformLastSave = try makeImageLoader()
93+
let imageLoaderToPerformLoad = try makeImageLoader()
94+
let feedLoader = try makeFeedLoader()
9595
let image = uniqueImage()
9696
let firstImageData = Data("first".utf8)
9797
let lastImageData = Data("last".utf8)
@@ -105,18 +105,18 @@ class EssentialFeedCacheIntegrationTests: XCTestCase {
105105

106106
// MARK: - Helpers
107107

108-
private func makeFeedLoader(currentDate: Date = Date(), file: StaticString = #filePath, line: UInt = #line) -> LocalFeedLoader {
108+
private func makeFeedLoader(currentDate: Date = Date(), file: StaticString = #filePath, line: UInt = #line) throws -> LocalFeedLoader {
109109
let storeURL = testSpecificStoreURL()
110-
let store = try! CoreDataFeedStore(storeURL: storeURL)
110+
let store = try CoreDataFeedStore(storeURL: storeURL)
111111
let sut = LocalFeedLoader(store: store, currentDate: { currentDate })
112112
trackForMemoryLeaks(store, file: file, line: line)
113113
trackForMemoryLeaks(sut, file: file, line: line)
114114
return sut
115115
}
116116

117-
private func makeImageLoader(file: StaticString = #filePath, line: UInt = #line) -> LocalFeedImageDataLoader {
117+
private func makeImageLoader(file: StaticString = #filePath, line: UInt = #line) throws -> LocalFeedImageDataLoader {
118118
let storeURL = testSpecificStoreURL()
119-
let store = try! CoreDataFeedStore(storeURL: storeURL)
119+
let store = try CoreDataFeedStore(storeURL: storeURL)
120120
let sut = LocalFeedImageDataLoader(store: store)
121121
trackForMemoryLeaks(store, file: file, line: line)
122122
trackForMemoryLeaks(sut, file: file, line: line)
@@ -178,11 +178,7 @@ class EssentialFeedCacheIntegrationTests: XCTestCase {
178178
}
179179

180180
private func testSpecificStoreURL() -> URL {
181-
return cachesDirectory().appendingPathComponent("\(type(of: self)).store")
182-
}
183-
184-
private func cachesDirectory() -> URL {
185-
return FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!
181+
.cachesDirectory.appendingPathComponent("\(type(of: self)).store")
186182
}
187183

188184
}

EssentialFeed/EssentialFeedTests/Feed Cache/CoreDataFeedImageDataStoreTests.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import EssentialFeed
77

88
class CoreDataFeedImageDataStoreTests: XCTestCase {
99

10-
func test_retrieveImageData_deliversNotFoundWhenEmpty() {
11-
let sut = makeSUT()
10+
func test_retrieveImageData_deliversNotFoundWhenEmpty() throws {
11+
let sut = try makeSUT()
1212

1313
expect(sut, toCompleteRetrievalWith: notFound(), for: anyURL())
1414
}
1515

16-
func test_retrieveImageData_deliversNotFoundWhenStoredDataURLDoesNotMatch() {
17-
let sut = makeSUT()
16+
func test_retrieveImageData_deliversNotFoundWhenStoredDataURLDoesNotMatch() throws {
17+
let sut = try makeSUT()
1818
let url = URL(string: "http://a-url.com")!
1919
let nonMatchingURL = URL(string: "http://another-url.com")!
2020

@@ -23,8 +23,8 @@ class CoreDataFeedImageDataStoreTests: XCTestCase {
2323
expect(sut, toCompleteRetrievalWith: notFound(), for: nonMatchingURL)
2424
}
2525

26-
func test_retrieveImageData_deliversFoundDataWhenThereIsAStoredImageDataMatchingURL() {
27-
let sut = makeSUT()
26+
func test_retrieveImageData_deliversFoundDataWhenThereIsAStoredImageDataMatchingURL() throws {
27+
let sut = try makeSUT()
2828
let storedData = anyData()
2929
let matchingURL = URL(string: "http://a-url.com")!
3030

@@ -33,8 +33,8 @@ class CoreDataFeedImageDataStoreTests: XCTestCase {
3333
expect(sut, toCompleteRetrievalWith: found(storedData), for: matchingURL)
3434
}
3535

36-
func test_retrieveImageData_deliversLastInsertedValue() {
37-
let sut = makeSUT()
36+
func test_retrieveImageData_deliversLastInsertedValue() throws {
37+
let sut = try makeSUT()
3838
let firstStoredData = Data("first".utf8)
3939
let lastStoredData = Data("last".utf8)
4040
let url = URL(string: "http://a-url.com")!
@@ -47,9 +47,9 @@ class CoreDataFeedImageDataStoreTests: XCTestCase {
4747

4848
// - MARK: Helpers
4949

50-
private func makeSUT(file: StaticString = #filePath, line: UInt = #line) -> CoreDataFeedStore {
50+
private func makeSUT(file: StaticString = #filePath, line: UInt = #line) throws -> CoreDataFeedStore {
5151
let storeURL = URL(fileURLWithPath: "/dev/null")
52-
let sut = try! CoreDataFeedStore(storeURL: storeURL)
52+
let sut = try CoreDataFeedStore(storeURL: storeURL)
5353
trackForMemoryLeaks(sut, file: file, line: line)
5454
return sut
5555
}

EssentialFeed/EssentialFeedTests/Feed Cache/CoreDataFeedStoreTests.swift

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,77 +7,77 @@ import EssentialFeed
77

88
class CoreDataFeedStoreTests: XCTestCase, FeedStoreSpecs {
99

10-
func test_retrieve_deliversEmptyOnEmptyCache() {
11-
let sut = makeSUT()
10+
func test_retrieve_deliversEmptyOnEmptyCache() throws {
11+
let sut = try makeSUT()
1212

1313
assertThatRetrieveDeliversEmptyOnEmptyCache(on: sut)
1414
}
1515

16-
func test_retrieve_hasNoSideEffectsOnEmptyCache() {
17-
let sut = makeSUT()
16+
func test_retrieve_hasNoSideEffectsOnEmptyCache() throws {
17+
let sut = try makeSUT()
1818

1919
assertThatRetrieveHasNoSideEffectsOnEmptyCache(on: sut)
2020
}
2121

22-
func test_retrieve_deliversFoundValuesOnNonEmptyCache() {
23-
let sut = makeSUT()
22+
func test_retrieve_deliversFoundValuesOnNonEmptyCache() throws {
23+
let sut = try makeSUT()
2424

2525
assertThatRetrieveDeliversFoundValuesOnNonEmptyCache(on: sut)
2626
}
2727

28-
func test_retrieve_hasNoSideEffectsOnNonEmptyCache() {
29-
let sut = makeSUT()
28+
func test_retrieve_hasNoSideEffectsOnNonEmptyCache() throws {
29+
let sut = try makeSUT()
3030

3131
assertThatRetrieveHasNoSideEffectsOnNonEmptyCache(on: sut)
3232
}
3333

34-
func test_insert_deliversNoErrorOnEmptyCache() {
35-
let sut = makeSUT()
34+
func test_insert_deliversNoErrorOnEmptyCache() throws {
35+
let sut = try makeSUT()
3636

3737
assertThatInsertDeliversNoErrorOnEmptyCache(on: sut)
3838
}
3939

40-
func test_insert_deliversNoErrorOnNonEmptyCache() {
41-
let sut = makeSUT()
40+
func test_insert_deliversNoErrorOnNonEmptyCache() throws {
41+
let sut = try makeSUT()
4242

4343
assertThatInsertDeliversNoErrorOnNonEmptyCache(on: sut)
4444
}
4545

46-
func test_insert_overridesPreviouslyInsertedCacheValues() {
47-
let sut = makeSUT()
46+
func test_insert_overridesPreviouslyInsertedCacheValues() throws {
47+
let sut = try makeSUT()
4848

4949
assertThatInsertOverridesPreviouslyInsertedCacheValues(on: sut)
5050
}
5151

52-
func test_delete_deliversNoErrorOnEmptyCache() {
53-
let sut = makeSUT()
52+
func test_delete_deliversNoErrorOnEmptyCache() throws {
53+
let sut = try makeSUT()
5454

5555
assertThatDeleteDeliversNoErrorOnEmptyCache(on: sut)
5656
}
5757

58-
func test_delete_hasNoSideEffectsOnEmptyCache() {
59-
let sut = makeSUT()
58+
func test_delete_hasNoSideEffectsOnEmptyCache() throws {
59+
let sut = try makeSUT()
6060

6161
assertThatDeleteHasNoSideEffectsOnEmptyCache(on: sut)
6262
}
6363

64-
func test_delete_deliversNoErrorOnNonEmptyCache() {
65-
let sut = makeSUT()
64+
func test_delete_deliversNoErrorOnNonEmptyCache() throws {
65+
let sut = try makeSUT()
6666

6767
assertThatDeleteDeliversNoErrorOnNonEmptyCache(on: sut)
6868
}
6969

70-
func test_delete_emptiesPreviouslyInsertedCache() {
71-
let sut = makeSUT()
70+
func test_delete_emptiesPreviouslyInsertedCache() throws {
71+
let sut = try makeSUT()
7272

7373
assertThatDeleteEmptiesPreviouslyInsertedCache(on: sut)
7474
}
7575

7676
// - MARK: Helpers
7777

78-
private func makeSUT(file: StaticString = #filePath, line: UInt = #line) -> FeedStore {
78+
private func makeSUT(file: StaticString = #filePath, line: UInt = #line) throws -> FeedStore {
7979
let storeURL = URL(fileURLWithPath: "/dev/null")
80-
let sut = try! CoreDataFeedStore(storeURL: storeURL)
80+
let sut = try CoreDataFeedStore(storeURL: storeURL)
8181
trackForMemoryLeaks(sut, file: file, line: line)
8282
return sut
8383
}

EssentialFeed/EssentialFeedTests/Feed Cache/FeedStoreSpecs/FeedStoreSpecs.swift

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,34 +5,34 @@
55
import Foundation
66

77
protocol FeedStoreSpecs {
8-
func test_retrieve_deliversEmptyOnEmptyCache()
9-
func test_retrieve_hasNoSideEffectsOnEmptyCache()
10-
func test_retrieve_deliversFoundValuesOnNonEmptyCache()
11-
func test_retrieve_hasNoSideEffectsOnNonEmptyCache()
8+
func test_retrieve_deliversEmptyOnEmptyCache() throws
9+
func test_retrieve_hasNoSideEffectsOnEmptyCache() throws
10+
func test_retrieve_deliversFoundValuesOnNonEmptyCache() throws
11+
func test_retrieve_hasNoSideEffectsOnNonEmptyCache() throws
1212

13-
func test_insert_deliversNoErrorOnEmptyCache()
14-
func test_insert_deliversNoErrorOnNonEmptyCache()
15-
func test_insert_overridesPreviouslyInsertedCacheValues()
13+
func test_insert_deliversNoErrorOnEmptyCache() throws
14+
func test_insert_deliversNoErrorOnNonEmptyCache() throws
15+
func test_insert_overridesPreviouslyInsertedCacheValues() throws
1616

17-
func test_delete_deliversNoErrorOnEmptyCache()
18-
func test_delete_hasNoSideEffectsOnEmptyCache()
19-
func test_delete_deliversNoErrorOnNonEmptyCache()
20-
func test_delete_emptiesPreviouslyInsertedCache()
17+
func test_delete_deliversNoErrorOnEmptyCache() throws
18+
func test_delete_hasNoSideEffectsOnEmptyCache() throws
19+
func test_delete_deliversNoErrorOnNonEmptyCache() throws
20+
func test_delete_emptiesPreviouslyInsertedCache() throws
2121
}
2222

2323
protocol FailableRetrieveFeedStoreSpecs: FeedStoreSpecs {
24-
func test_retrieve_deliversFailureOnRetrievalError()
25-
func test_retrieve_hasNoSideEffectsOnFailure()
24+
func test_retrieve_deliversFailureOnRetrievalError() throws
25+
func test_retrieve_hasNoSideEffectsOnFailure() throws
2626
}
2727

2828
protocol FailableInsertFeedStoreSpecs: FeedStoreSpecs {
29-
func test_insert_deliversErrorOnInsertionError()
30-
func test_insert_hasNoSideEffectsOnInsertionError()
29+
func test_insert_deliversErrorOnInsertionError() throws
30+
func test_insert_hasNoSideEffectsOnInsertionError() throws
3131
}
3232

3333
protocol FailableDeleteFeedStoreSpecs: FeedStoreSpecs {
34-
func test_delete_deliversErrorOnDeletionError()
35-
func test_delete_hasNoSideEffectsOnDeletionError()
34+
func test_delete_deliversErrorOnDeletionError() throws
35+
func test_delete_hasNoSideEffectsOnDeletionError() throws
3636
}
3737

3838
typealias FailableFeedStoreSpecs = FailableRetrieveFeedStoreSpecs & FailableInsertFeedStoreSpecs & FailableDeleteFeedStoreSpecs

0 commit comments

Comments
 (0)