You Don't Need MVVM to Test SwiftUI

protocol MovieLoader { func load() async throws -> [Movie] } struct MovieList: View { @State var movies = [Movie]() let loader: MovieLoader var body: some View { List(movies, rowContent: MovieRo...

By · · 1 min read
You Don't Need MVVM to Test SwiftUI

Source: DEV Community

protocol MovieLoader { func load() async throws -> [Movie] } struct MovieList: View { @State var movies = [Movie]() let loader: MovieLoader var body: some View { List(movies, rowContent: MovieRow.init) .task { await load() } } func load() async { movies = (try? await loader.load()) ?? [] } } func test_load_loadsMovies() async { let expected = [anyMovie()] let stubbed = StubMovieLoader(stubs: expected) let sut = MovieList(loader: stubbed) await sut.load() XCTAssertEqual(sut.movies, expected) } If you try to run this test as-is, it will fail. Thehe reason is that @State in a SwiftUI view only connects to an in-memory store if the view has been mounted into a real view hierarchy. The most common workaround is to move the logic into an @Observable. @Observable class MovieListViewModel { var movies = [Movie]() let loader: MovieLoader init(loader: MovieLoader = RemoteMovieLoader()) { ... } func load() async { movies = (try? await loader.load()) ?? [] } } struct MovieList: View { @State va

Related Posts

Trending on ShareHub

  1. Understanding Modern JavaScript Frameworks in 2026
    by Alex Chen · Feb 12, 2026 · 0 likes
  2. The System Design Primer
    by Sarah Kim · Feb 12, 2026 · 0 likes
  3. Just shipped my first open-source project!
    by Alex Chen · Feb 12, 2026 · 0 likes
  4. OpenAI Blog
    by Sarah Kim · Feb 12, 2026 · 0 likes
  5. Building Accessible Web Applications: A Practical Guide
    by Alex Chen · Feb 12, 2026 · 0 likes
  6. Rapper Lil Poppa dead at 25, days after releasing new music
    Rapper Lil Poppa dead at 25, days after releasing new music
    by Anonymous User · Feb 19, 2026 · 0 likes
  7. write-for-us
    by Volt Raven · Mar 7, 2026 · 0 likes
  8. Before the Coffee Gets Cold: Heartfelt Story of Time Travel and Second Chances
    Before the Coffee Gets Cold: Heartfelt Story of Time Travel and Second Chances
    by Anonymous User · Feb 12, 2026 · 0 likes
    #coffee gets cold #the #time travel
  9. Best DoorDash Promo Code Reddit Finds for Top Discounts
    Best DoorDash Promo Code Reddit Finds for Top Discounts
    by Anonymous User · Feb 12, 2026 · 0 likes
    #doordash #promo #reddit
  10. Premium SEO Services That Boost Rankings & Revenue | VirtualSEO.Expert
    by Anonymous User · Feb 12, 2026 · 0 likes
  11. NBC under fire for commentary about Team USA women's hockey team
    NBC under fire for commentary about Team USA women's hockey team
    by Anonymous User · Feb 18, 2026 · 0 likes
  12. Where to Watch The Nanny: Streaming and Online Viewing Options
    Where to Watch The Nanny: Streaming and Online Viewing Options
    by Anonymous User · Feb 12, 2026 · 0 likes
    #streaming #the nanny #where
  13. How Much Is Kindle Unlimited? Subscription Cost and Plan Details
    How Much Is Kindle Unlimited? Subscription Cost and Plan Details
    by Anonymous User · Feb 12, 2026 · 0 likes
    #kindle unlimited #subscription #unlimited
  14. Russian skater facing backlash for comment about Amber Glenn
    Russian skater facing backlash for comment about Amber Glenn
    by Anonymous User · Feb 18, 2026 · 0 likes
  15. Google News
    Google News
    by Anonymous User · Feb 18, 2026 · 0 likes

Latest on ShareHub

Browse Topics

#ai (3581)#news (2453)#webdev (1565)#business (1161)#programming (1061)#opensource (882)#/business (853)#security (806)#productivity (754)#sa transcripts (733)

Around the Network