preactjs / signals

Manage state with style in every framework
https://preactjs.com/blog/introducing-signals/
MIT License
3.63k stars 88 forks source link

Unable to assert change to UI with testing library when a signal triggers the change #270

Open nerdo opened 1 year ago

nerdo commented 1 year ago

I ran into what appears to be a bug when using testing library and a simple signal.

Here's a stackblitz setup illustrating the issue: https://stackblitz.com/edit/vitejs-vite-adbvfx?file=src%2FApp.tsx,src%2FApp.test.tsx&terminal=dev

Each button simply triggers a function that sets a string. One does it using useState, and the other does it with a signal. When each respective value is set, it is displayed in a <div></div>.

There are tests inApp.test.tsx is where the issue lies. The test that tests clicking the button that changes the value with useState passes, while the one changing the value in a similar way with a signal fails.

To run the tests in the stackblitz, open the terminal and run vitest.

mfal commented 3 months ago

You can workaround this issue by testing your expectations inside the waitFor function.

import React from "react";
import { expect, test } from "vitest";
import { render, waitFor } from "@testing-library/react";

test("Renders as expected", async () => {
  render(
    <ComponentUsingSignals />,
  );

  await waitFor(() => {
    // expectations
  });
});