Skip to content

Instantly share code, notes, and snippets.

@linw1995
Last active November 24, 2020 11:45
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save linw1995/721d871ea392524a1ff850d5ece53868 to your computer and use it in GitHub Desktop.
Save linw1995/721d871ea392524a1ff850d5ece53868 to your computer and use it in GitHub Desktop.
Python fake sleep fixture for pytest.
import functools
from datetime import datetime, timedelta
from unittest import mock
from freezegun import freeze_time
def fake_sleep(func):
freezegun_control = None
def fake_sleep(seconds):
nonlocal freezegun_control
utcnow = datetime.utcnow()
if freezegun_control is not None:
freezegun_control.stop()
freezegun_control = freeze_time(utcnow + timedelta(seconds=seconds))
freezegun_control.start()
@functools.wraps(func)
def wrapper(*args, **kwargs):
with mock.patch('time.sleep', fake_sleep):
rv = func(*args, **kwargs)
if freezegun_control is not None:
freezegun_control.stop()
return rv
return wrapper
@fake_sleep
def test_sleep():
import time
now = datetime.utcnow()
for sleep_seconds in range(10):
for i in range(1, 10):
time.sleep(sleep_seconds)
assert datetime.utcnow() - now >= timedelta(
seconds=i * sleep_seconds)
from datetime import datetime, timedelta
import freezegun
import pytest
@pytest.fixture
def sleep():
freezegun_control = None
def fake_sleep(seconds):
nonlocal freezegun_control
utcnow = datetime.utcnow()
if freezegun_control is not None:
freezegun_control.stop()
freezegun_control = freezegun.freeze_time(
utcnow + timedelta(seconds=seconds))
freezegun_control.start()
yield fake_sleep
if freezegun_control is not None:
freezegun_control.stop()
def test_fake_sleep(sleep):
now = datetime.utcnow()
for sleep_seconds in range(10):
for i in range(1, 10):
sleep(sleep_seconds)
assert datetime.utcnow() - now >= timedelta(
seconds=i * sleep_seconds)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment