Skip to content

isSuccess() not triggering effect() during testing #9981

Closed

Description

@JPtenBerge

Describe the bug

I have this AppComponent, with an effect() that's dependent on the isSuccess() of a query:

@Component({
	selector: 'app-root',
	templateUrl: './app.html',
	imports: [ReactiveFormsModule],
	styleUrl: './app.css',
	changeDetection: ChangeDetectionStrategy.OnPush,
})
export class App {
	dataService = inject(DataService);

	formField = new FormControl<number>(42);

	query = injectQuery(() => ({
		queryKey: ['query'],
		queryFn: () => {
			console.log('in query', this.dataService.give());
			return this.dataService.give();
		},
	}));

	constructor() {
		effect(() => {
			console.log('in effect:', this.query.isSuccess());
			if (!this.query.isSuccess()) return;

			console.log('setting form value');
			this.formField.setValue(9999);
		});
	}
}

And I'm trying to test this, either through the classic TestBed or new Vitest features combined with the Testing Library:

describe('App', () => {
	let dataServiceMock: Mocked<DataService>;

	beforeEach(() => {
		dataServiceMock = { give: vi.fn().mockReturnValue(Promise.resolve([30, 40, 50])) } as Mocked<DataService>;
	});

	it('should work using the testing library', async () => {
		let sut = await render(App, {
			providers: [provideQueryClient(new QueryClient()), { provide: DataService, useValue: dataServiceMock }],
		});

		await sut.rerender();
		sut.detectChanges();
		await sut.fixture.whenStable();
		await sut.rerender();
		sut.detectChanges();
		await sut.fixture.whenStable();
		await sut.rerender();
		sut.detectChanges();
		await sut.fixture.whenStable();
		await sut.rerender();
		sut.detectChanges();
		await sut.fixture.whenStable();
		await sut.rerender();
		TestBed.tick();
		TestBed.tick();
		TestBed.tick();
		sut.fixture.detectChanges();
		await sut.fixture.whenStable();
		sut.detectChanges();
		await sut.fixture.whenStable();
		await sut.rerender();
		await expect(page.getByRole('textbox')).toHaveValue(9999);
		expect(sut.fixture.componentInstance.formField.value).toBe(9999);
	});

	it('should work using TestBed', async () => {
		TestBed.configureTestingModule({
			imports: [App],
			providers: [provideQueryClient(new QueryClient()), { provide: DataService, useValue: dataServiceMock }],
		});
		let fixture = TestBed.createComponent(App);
		let sut = fixture.componentInstance;

		fixture.detectChanges();
		await fixture.whenStable();
		fixture.detectChanges();
		await fixture.whenStable();
		fixture.detectChanges();
		await fixture.whenStable();
		TestBed.tick();
		TestBed.tick();
		TestBed.tick();
		TestBed.tick();
		fixture.detectChanges();
		await fixture.whenStable();

		expect(sut.formField.value).toBe(9999);
	});
});

But isSuccess() in the effect() never becomes true even though I'm clearly returning data. I've logged the result of the DataService, it's returning a fulfilled promise as arranged.

The many tick()/detectChanges()/whenStable() are my desperate attempts at getting something to work btw.

This may have something to do with the issue of requiring Angular v19+ and relying on component effect schedule timing.

Your minimal, reproducible example

https://github.com/JPtenBerge/tanstack-query-query-effect-bug

Steps to reproduce

  1. Define a query using injectQuery() that on init calls some sort of a service for retrieving data
  2. In the constructor, creating an effect() that updates something like a component variable if isSuccess() of the above defined query.
  3. In a Vitest browser-based test, configure the testing module with a mock for the above mentioned data service.
  4. Assert whether the component variable or something similar has been updated.

Vitest config in angular.json:

"test": {
  "builder": "@angular/build:unit-test",
  "options": {
    "browsers": ["chromium"]
  }
}

Expected behavior

I expect the effect() to be called again and seeing isSuccess() of the query being true, but it's not called again.

How often does this bug happen?

Every time

Screenshots or Videos

No response

Platform

  • OS: Windows 11
  • Browser: Chromium for testing

Tanstack Query adapter

angular-query

TanStack Query version

v5.90.16

TypeScript version

v5.9.2

Additional context

No response

Activity

  1. coderabbitai commented on Dec 17, 2025

    @coderabbitai
    Contributor

    📝 CodeRabbit Plan Mode

    Generate an implementation plan and prompts that you can use with your favorite coding agent.

    • Create Plan
    Examples
    You can configure auto-planning by selecting labels in the issue_enrichment configuration.

    🔗 Similar Issues

    Possible Duplicates

    🔗 Related PRs

    #8690 - [WIP] Angular injectQueries fixes [merged]
    #9666 - feat(angular-query): integrate with Angular v19+ PendingTasks for whenStable() support [merged]
    #9692 - chore: update svelte examples and tests from runes PR [merged]
    #9772 - fix(core): observing "promise" needs to implicitly observe "data" [merged]
    TanStack/router#5802 - test(router, start): query navigation transitions [merged]

    👤 Suggested Assignees


    🧪 Issue enrichment is currently in open beta.

    To disable automatic issue enrichment, add the following to your .coderabbit.yaml:

    issue_enrichment:
      auto_enrich:
        enabled: false

    💬 Have feedback or questions? Drop into our discord or schedule a call!

  2. TkDodo commented on Dec 27, 2025

    @TkDodo
    Collaborator
  3. JPtenBerge commented on Mar 28, 2026

    @JPtenBerge
    Author

    Any updates by any chance?

  4. benjavicente commented on Sep 23, 2026

    @benjavicente
    Member

    We started to release a RC version of the stable package that fixes this issue.

    npm i @tanstack/angular-query@rc

    It has some breaking changes to fix other issues of the experimental package. See the migration guide. If you have any question or issue, please let us knwon in here or the Angular Channel in Discord.

  5. JPtenBerge commented on Sep 29, 2026

    @JPtenBerge
    Author

    Lovely work, thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions