Skip to content

Commit e4225be

Browse files
authored
Add test for view store state access (#642)
1 parent b931cec commit e4225be

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

Sources/ComposableArchitecture/ViewStore.swift

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ public final class ViewStore<State, Action>: ObservableObject {
6161
// won't be synthesized automatically. To work around issues on iOS 13 we explicitly declare it.
6262
public private(set) lazy var objectWillChange = ObservableObjectPublisher()
6363

64+
/// The current state.
65+
public var state: State { self.store.state.value }
66+
67+
private let store: Store<State, Action>
68+
6469
/// Initializes a view store from a store.
6570
///
6671
/// - Parameters:
@@ -72,20 +77,13 @@ public final class ViewStore<State, Action>: ObservableObject {
7277
removeDuplicates isDuplicate: @escaping (State, State) -> Bool
7378
) {
7479
self.publisher = StorePublisher(store.state, removeDuplicates: isDuplicate)
75-
self._state = { store.state.value }
76-
self._send = store.send
80+
self.store = store
7781
self.viewCancellable = store.state
7882
.dropFirst()
7983
.removeDuplicates(by: isDuplicate)
8084
.sink { [weak self] _ in self?.objectWillChange.send() }
8185
}
8286

83-
let _state: () -> State
84-
let _send: (Action) -> Void
85-
86-
/// The current state.
87-
public var state: State { _state() }
88-
8987
/// Returns the resulting value of a given key path.
9088
public subscript<LocalState>(dynamicMember keyPath: KeyPath<State, LocalState>) -> LocalState {
9189
self.state[keyPath: keyPath]
@@ -101,7 +99,7 @@ public final class ViewStore<State, Action>: ObservableObject {
10199
///
102100
/// - Parameter action: An action.
103101
public func send(_ action: Action) {
104-
self._send(action)
102+
self.store.send(action)
105103
}
106104

107105
/// Derives a binding from the store that prevents direct writes to state and instead sends

Tests/ComposableArchitectureTests/ViewStoreTests.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,28 @@ final class ViewStoreTests: XCTestCase {
7575
XCTAssertEqual(28, equalityChecks)
7676
XCTAssertEqual(44, subEqualityChecks)
7777
}
78+
79+
func testAccessViewStoreStateInPublisherSink() {
80+
let reducer = Reducer<Int, Void, Void> { count, _, _ in
81+
count += 1
82+
return .none
83+
}
84+
85+
let store = Store(initialState: 0, reducer: reducer, environment: ())
86+
let viewStore = ViewStore(store)
87+
88+
var results: [Int] = []
89+
90+
viewStore.publisher
91+
.sink { _ in results.append(viewStore.state) }
92+
.store(in: &self.cancellables)
93+
94+
viewStore.send(())
95+
viewStore.send(())
96+
viewStore.send(())
97+
98+
XCTAssertEqual([0, 1, 2, 3], results)
99+
}
78100
}
79101

80102
private struct State: Equatable {

0 commit comments

Comments
 (0)