Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support sinon fake timers #1187

Open
thatsmydoing opened this issue Mar 6, 2023 · 3 comments
Open

Support sinon fake timers #1187

thatsmydoing opened this issue Mar 6, 2023 · 3 comments

Comments

@thatsmydoing
Copy link

Describe the feature you'd like:

When using waitFor and sinon fake timers enabled, the test gets stuck and eventually times out. This seems to be a consequence of f78839b which adds a setTimeout.

Suggested implementation:

Supporting it in the same way jest timers are supported is probably okay, alternatively provide configuration for generically supporting arbitrary fake timer implementations.

Describe alternatives you've considered:

Adding the following to our test setup seems to work with the current version but it could easily get out of sync and it would be nice to have it built in or provide nicer abstraction to configure.

import { configure } from '@testing-library/react';
import sinon from 'sinon';

configure({
  asyncWrapper: async (cb) => {
    // our tests run only in the browser but this should more properly be getIsReactActEnvironment()
    const previousActEnvironment = window.IS_REACT_ACT_ENVIRONMENT;
    window.IS_REACT_ACT_ENVIRONMENT = false;
    try {
      const result = await cb();
      // Drain microtask queue.
      // Otherwise we'll restore the previous act() environment, before we resolve the `waitFor` call.
      // The caller would have no chance to wrap the in-flight Promises in `act()`
      await new Promise(resolve => {
        setTimeout(() => {
          resolve();
        }, 0);
        // run callbacks if we've mocked out global timers
        if (window.Date.isFake) {
          sinon.clock.tick(0);
        }
      });
      return result;
    } finally {
      window.IS_REACT_ACT_ENVIRONMENT = previousActEnvironment;
    }
  },
});

Teachability, Documentation, Adoption, Migration Strategy:

Ideally, it should just work. Otherwise, examples for how to configure it would be nice.

@thatsmydoing
Copy link
Author

Alternatively, flush the queue without using setTimeout like what react does in https://github.com/facebook/react/blob/main/packages/shared/enqueueTask.js

@eugenet8k
Copy link

This would be great, jest fake timers are supported in RTL, but sinon fake times are widely used. We can't build a few scenarios due to this limitation at the moment.

@Aryan3212
Copy link

Use this snippet if you only want the current time to be faked

sinon.useFakeTimers({
        now: (new Date(2024, 7, 21)).getTime(),
        toFake: ['Date'],
      });

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants