@@ -11,22 +11,27 @@ import EssentialFeediOS
1111class FeedAcceptanceTests : XCTestCase {
1212
1313 func test_onLaunch_displaysRemoteFeedWhenCustomerHasConnectivity( ) throws {
14- let feed = try launch ( httpClient: . online( response) , store: . empty)
14+ let store = try CoreDataFeedStore . empty
15+ let feed = try launch ( httpClient: . online( response) , store: store)
1516
1617 XCTAssertEqual ( feed. numberOfRenderedFeedImageViews ( ) , 2 )
1718 XCTAssertEqual ( feed. renderedFeedImageData ( at: 0 ) , makeImageData0 ( ) )
1819 XCTAssertEqual ( feed. renderedFeedImageData ( at: 1 ) , makeImageData1 ( ) )
1920 XCTAssertTrue ( feed. canLoadMoreFeed)
2021
21- feed. simulateLoadMoreFeedAction ( )
22+ try store. withWaitingChanges {
23+ feed. simulateLoadMoreFeedAction ( )
24+ }
2225
2326 XCTAssertEqual ( feed. numberOfRenderedFeedImageViews ( ) , 3 )
2427 XCTAssertEqual ( feed. renderedFeedImageData ( at: 0 ) , makeImageData0 ( ) )
2528 XCTAssertEqual ( feed. renderedFeedImageData ( at: 1 ) , makeImageData1 ( ) )
2629 XCTAssertEqual ( feed. renderedFeedImageData ( at: 2 ) , makeImageData2 ( ) )
2730 XCTAssertTrue ( feed. canLoadMoreFeed)
2831
29- feed. simulateLoadMoreFeedAction ( )
32+ try store. withWaitingChanges {
33+ feed. simulateLoadMoreFeedAction ( )
34+ }
3035
3136 XCTAssertEqual ( feed. numberOfRenderedFeedImageViews ( ) , 3 )
3237 XCTAssertEqual ( feed. renderedFeedImageData ( at: 0 ) , makeImageData0 ( ) )
@@ -41,7 +46,9 @@ class FeedAcceptanceTests: XCTestCase {
4146 let onlineFeed = try launch ( httpClient: . online( response) , store: sharedStore)
4247 onlineFeed. simulateFeedImageViewVisible ( at: 0 )
4348 onlineFeed. simulateFeedImageViewVisible ( at: 1 )
44- onlineFeed. simulateLoadMoreFeedAction ( )
49+ try sharedStore. withWaitingChanges {
50+ onlineFeed. simulateLoadMoreFeedAction ( )
51+ }
4552 onlineFeed. simulateFeedImageViewVisible ( at: 2 )
4653
4754 let offlineFeed = try launch ( httpClient: . offline, store: sharedStore)
@@ -186,6 +193,25 @@ class FeedAcceptanceTests: XCTestCase {
186193
187194@MainActor
188195extension CoreDataFeedStore {
196+ private struct Timeout : Error { }
197+
198+ func withWaitingChanges( _ action: ( ) -> Void , timeout: TimeInterval = 1 ) throws {
199+ let state = try retrieve ( ) ? . timestamp
200+ action ( )
201+
202+ let maxDate = Date ( ) + timeout
203+
204+ while Date ( ) <= maxDate {
205+ if try retrieve ( ) ? . timestamp != state {
206+ return
207+ }
208+
209+ RunLoop . current. run ( until: Date ( ) )
210+ }
211+
212+ throw Timeout ( )
213+ }
214+
189215 static var empty : CoreDataFeedStore {
190216 get throws {
191217 try CoreDataFeedStore ( storeURL: URL ( fileURLWithPath: " /dev/null " ) , contextQueue: . main)
0 commit comments