Fake utcnow for the pytestUnit Testing of parser method using pytestTrying to use global variables for referencing directories in Python 2.5TDD - Kata - String CalculatorMocking UserDefaults in SwiftPython - Faster random business date generationHours and Minutes math in a work week calculatorApply a series of functions on Django querysets using decoratorsCode to implement the Jaro similarity for fuzzy matching stringsMaking a graph of the import structure of a programCurrency converter - CLI and API
Formatting a table to look nice
Difference between 'stomach' and 'uterus'
I can't die. Who am I?
Ahoy, Ye Traveler!
Is there a full canon version of Tyrion's jackass/honeycomb joke?
Why do phishing e-mails use faked e-mail addresses instead of the real one?
Is there any relevance to Thor getting his hair cut other than comedic value?
It doesn't matter the side you see it
Should we avoid writing fiction about historical events without extensive research?
A bug in Excel? Conditional formatting for marking duplicates also highlights unique value
When to use mean vs median
Is divide-by-zero a security vulnerability?
Canadian citizen, on US no-fly list. What can I do in order to be allowed on flights which go through US airspace?
How can neutral atoms have exactly zero electric field when there is a difference in the positions of the charges?
PTIJ: Why can't I sing about soda on certain days?
is 'sed' thread safe
Specific Chinese carabiner QA?
Can a Trickery Domain cleric cast a spell through the Invoke Duplicity clone while inside a Forcecage?
Are there other characters in the Star Wars universe who had damaged bodies and needed to wear an outfit like Darth Vader?
School performs periodic password audits. Is my password compromised?
Misplaced tyre lever - alternatives?
How can I handle a player who pre-plans arguments about my rulings on RAW?
How to mitigate "bandwagon attacking" from players?
“I had a flat in the centre of town, but I didn’t like living there, so …”
Fake utcnow for the pytest
Unit Testing of parser method using pytestTrying to use global variables for referencing directories in Python 2.5TDD - Kata - String CalculatorMocking UserDefaults in SwiftPython - Faster random business date generationHours and Minutes math in a work week calculatorApply a series of functions on Django querysets using decoratorsCode to implement the Jaro similarity for fuzzy matching stringsMaking a graph of the import structure of a programCurrency converter - CLI and API
$begingroup$
I want to create a pytest with a fake utcnow
, but also I need to preserve the functionality of all other datetime
methods. Simple example here:
import datetime as dt
class FakeTime(dt.datetime):
fake_time = None
@classmethod
def utcnow(cls):
return cls.fake_time
def str_2_time(str_dt: str) -> dt.datetime:
"""Shortcut to do convert the string to datetime"""
return dt.datetime.strptime(str_dt, '%Y-%m-%d %H:%M')
def test_patch_datetime():
for utc_time in ['2019-01-01 10:00', '2019-02-01 13:00', '2019-03-01 16:00']:
FakeTime.fake_time = str_2_time(utc_time)
dt.datetime = FakeTime
assert dt.datetime.utcnow() == str_2_time(utc_time)
Is this the right way?
The method str_2_time
just need to show that all other methods of the datetime works fine.
python datetime unit-testing mocks
New contributor
$endgroup$
add a comment |
$begingroup$
I want to create a pytest with a fake utcnow
, but also I need to preserve the functionality of all other datetime
methods. Simple example here:
import datetime as dt
class FakeTime(dt.datetime):
fake_time = None
@classmethod
def utcnow(cls):
return cls.fake_time
def str_2_time(str_dt: str) -> dt.datetime:
"""Shortcut to do convert the string to datetime"""
return dt.datetime.strptime(str_dt, '%Y-%m-%d %H:%M')
def test_patch_datetime():
for utc_time in ['2019-01-01 10:00', '2019-02-01 13:00', '2019-03-01 16:00']:
FakeTime.fake_time = str_2_time(utc_time)
dt.datetime = FakeTime
assert dt.datetime.utcnow() == str_2_time(utc_time)
Is this the right way?
The method str_2_time
just need to show that all other methods of the datetime works fine.
python datetime unit-testing mocks
New contributor
$endgroup$
$begingroup$
I highly recommend this lib for mockingnow
in python tests github.com/spulec/freezegun
$endgroup$
– Anentropic
15 hours ago
$begingroup$
@Anentropic thank you, but if i will need more options i will add the package to the project
$endgroup$
– Bear Brown
14 hours ago
add a comment |
$begingroup$
I want to create a pytest with a fake utcnow
, but also I need to preserve the functionality of all other datetime
methods. Simple example here:
import datetime as dt
class FakeTime(dt.datetime):
fake_time = None
@classmethod
def utcnow(cls):
return cls.fake_time
def str_2_time(str_dt: str) -> dt.datetime:
"""Shortcut to do convert the string to datetime"""
return dt.datetime.strptime(str_dt, '%Y-%m-%d %H:%M')
def test_patch_datetime():
for utc_time in ['2019-01-01 10:00', '2019-02-01 13:00', '2019-03-01 16:00']:
FakeTime.fake_time = str_2_time(utc_time)
dt.datetime = FakeTime
assert dt.datetime.utcnow() == str_2_time(utc_time)
Is this the right way?
The method str_2_time
just need to show that all other methods of the datetime works fine.
python datetime unit-testing mocks
New contributor
$endgroup$
I want to create a pytest with a fake utcnow
, but also I need to preserve the functionality of all other datetime
methods. Simple example here:
import datetime as dt
class FakeTime(dt.datetime):
fake_time = None
@classmethod
def utcnow(cls):
return cls.fake_time
def str_2_time(str_dt: str) -> dt.datetime:
"""Shortcut to do convert the string to datetime"""
return dt.datetime.strptime(str_dt, '%Y-%m-%d %H:%M')
def test_patch_datetime():
for utc_time in ['2019-01-01 10:00', '2019-02-01 13:00', '2019-03-01 16:00']:
FakeTime.fake_time = str_2_time(utc_time)
dt.datetime = FakeTime
assert dt.datetime.utcnow() == str_2_time(utc_time)
Is this the right way?
The method str_2_time
just need to show that all other methods of the datetime works fine.
python datetime unit-testing mocks
python datetime unit-testing mocks
New contributor
New contributor
edited 17 hours ago
Bear Brown
New contributor
asked 21 hours ago
Bear BrownBear Brown
1236
1236
New contributor
New contributor
$begingroup$
I highly recommend this lib for mockingnow
in python tests github.com/spulec/freezegun
$endgroup$
– Anentropic
15 hours ago
$begingroup$
@Anentropic thank you, but if i will need more options i will add the package to the project
$endgroup$
– Bear Brown
14 hours ago
add a comment |
$begingroup$
I highly recommend this lib for mockingnow
in python tests github.com/spulec/freezegun
$endgroup$
– Anentropic
15 hours ago
$begingroup$
@Anentropic thank you, but if i will need more options i will add the package to the project
$endgroup$
– Bear Brown
14 hours ago
$begingroup$
I highly recommend this lib for mocking
now
in python tests github.com/spulec/freezegun$endgroup$
– Anentropic
15 hours ago
$begingroup$
I highly recommend this lib for mocking
now
in python tests github.com/spulec/freezegun$endgroup$
– Anentropic
15 hours ago
$begingroup$
@Anentropic thank you, but if i will need more options i will add the package to the project
$endgroup$
– Bear Brown
14 hours ago
$begingroup$
@Anentropic thank you, but if i will need more options i will add the package to the project
$endgroup$
– Bear Brown
14 hours ago
add a comment |
2 Answers
2
active
oldest
votes
$begingroup$
According to this, subclassing datetime.datetime
seems the way to go.
There is no use for the str_2_time
method though. You can easily inline this, or even simpler, just use the datetime.datetime
constructor:
def test_patch_datetime():
for utc_time in [
dt.datetime(2019, 1, 1, 10),
dt.datetime(2019, 2, 1, 13),
dt.datetime(2019, 3, 1, 16),
]:
FakeTime.fake_time = utc_time
dt.datetime = FakeTime
assert dt.datetime.utcnow() == utc_time
You should be aware that this can have side effects in other parts of your code, so it might be needed to replace it back with the original class after the test method:
def test_patch_datetime():
datetime_orig = dt.datetime
utc_times = [
dt.datetime(2019, 1, 1, 10),
dt.datetime(2019, 2, 1, 13),
dt.datetime(2019, 3, 1, 16),
]
for utc_time in utc_times:
FakeTime.fake_time = utc_time
dt.datetime = FakeTime
assert dt.datetime.utcnow() == utc_time
dt.datetime = datetime_orig
# print(dt.datetime.utcnow())
assert dt.datetime.utcnow() > max(utc_times)
$endgroup$
$begingroup$
thank you, but the methodstr_2_time
just need to show that all other methods of thedatetime
works fine.
$endgroup$
– Bear Brown
20 hours ago
add a comment |
$begingroup$
Usually, I do:
- Separate module, for example
utils.py
, that contains:
from datetime import datetime
def get_utcnow() -> datetime:
return datetime.utcnow()
- Use this function everywhere in my code.
- Add the mocking fixture in
tests/conftest.py
:
from datetime import datetime, timedelta
import pytest
from .. import utils
@pytest.fixture
def mock_utcnow(monkeypatch):
now = datetime.min
def wrapped(delta=0.0):
when = now + timedelta(delta)
monkeypatch.setattr(utils, "get_utcnow", lambda: when)
return when
return wrapped
- Now it's easy to use it in your tests:
def test(mock_utcnow):
now = mock_utcnow()
new_now = mock_utcnow(0.1)
Additionally, with this fixture you can set the returning value with desired offset.
Hope it helps.
New contributor
$endgroup$
$begingroup$
thank you for the answer, but i don't understand how it should help for my case.
$endgroup$
– Bear Brown
14 hours ago
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
return StackExchange.using("mathjaxEditing", function ()
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
);
);
, "mathjax-editing");
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "196"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Bear Brown is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f214816%2ffake-utcnow-for-the-pytest%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
$begingroup$
According to this, subclassing datetime.datetime
seems the way to go.
There is no use for the str_2_time
method though. You can easily inline this, or even simpler, just use the datetime.datetime
constructor:
def test_patch_datetime():
for utc_time in [
dt.datetime(2019, 1, 1, 10),
dt.datetime(2019, 2, 1, 13),
dt.datetime(2019, 3, 1, 16),
]:
FakeTime.fake_time = utc_time
dt.datetime = FakeTime
assert dt.datetime.utcnow() == utc_time
You should be aware that this can have side effects in other parts of your code, so it might be needed to replace it back with the original class after the test method:
def test_patch_datetime():
datetime_orig = dt.datetime
utc_times = [
dt.datetime(2019, 1, 1, 10),
dt.datetime(2019, 2, 1, 13),
dt.datetime(2019, 3, 1, 16),
]
for utc_time in utc_times:
FakeTime.fake_time = utc_time
dt.datetime = FakeTime
assert dt.datetime.utcnow() == utc_time
dt.datetime = datetime_orig
# print(dt.datetime.utcnow())
assert dt.datetime.utcnow() > max(utc_times)
$endgroup$
$begingroup$
thank you, but the methodstr_2_time
just need to show that all other methods of thedatetime
works fine.
$endgroup$
– Bear Brown
20 hours ago
add a comment |
$begingroup$
According to this, subclassing datetime.datetime
seems the way to go.
There is no use for the str_2_time
method though. You can easily inline this, or even simpler, just use the datetime.datetime
constructor:
def test_patch_datetime():
for utc_time in [
dt.datetime(2019, 1, 1, 10),
dt.datetime(2019, 2, 1, 13),
dt.datetime(2019, 3, 1, 16),
]:
FakeTime.fake_time = utc_time
dt.datetime = FakeTime
assert dt.datetime.utcnow() == utc_time
You should be aware that this can have side effects in other parts of your code, so it might be needed to replace it back with the original class after the test method:
def test_patch_datetime():
datetime_orig = dt.datetime
utc_times = [
dt.datetime(2019, 1, 1, 10),
dt.datetime(2019, 2, 1, 13),
dt.datetime(2019, 3, 1, 16),
]
for utc_time in utc_times:
FakeTime.fake_time = utc_time
dt.datetime = FakeTime
assert dt.datetime.utcnow() == utc_time
dt.datetime = datetime_orig
# print(dt.datetime.utcnow())
assert dt.datetime.utcnow() > max(utc_times)
$endgroup$
$begingroup$
thank you, but the methodstr_2_time
just need to show that all other methods of thedatetime
works fine.
$endgroup$
– Bear Brown
20 hours ago
add a comment |
$begingroup$
According to this, subclassing datetime.datetime
seems the way to go.
There is no use for the str_2_time
method though. You can easily inline this, or even simpler, just use the datetime.datetime
constructor:
def test_patch_datetime():
for utc_time in [
dt.datetime(2019, 1, 1, 10),
dt.datetime(2019, 2, 1, 13),
dt.datetime(2019, 3, 1, 16),
]:
FakeTime.fake_time = utc_time
dt.datetime = FakeTime
assert dt.datetime.utcnow() == utc_time
You should be aware that this can have side effects in other parts of your code, so it might be needed to replace it back with the original class after the test method:
def test_patch_datetime():
datetime_orig = dt.datetime
utc_times = [
dt.datetime(2019, 1, 1, 10),
dt.datetime(2019, 2, 1, 13),
dt.datetime(2019, 3, 1, 16),
]
for utc_time in utc_times:
FakeTime.fake_time = utc_time
dt.datetime = FakeTime
assert dt.datetime.utcnow() == utc_time
dt.datetime = datetime_orig
# print(dt.datetime.utcnow())
assert dt.datetime.utcnow() > max(utc_times)
$endgroup$
According to this, subclassing datetime.datetime
seems the way to go.
There is no use for the str_2_time
method though. You can easily inline this, or even simpler, just use the datetime.datetime
constructor:
def test_patch_datetime():
for utc_time in [
dt.datetime(2019, 1, 1, 10),
dt.datetime(2019, 2, 1, 13),
dt.datetime(2019, 3, 1, 16),
]:
FakeTime.fake_time = utc_time
dt.datetime = FakeTime
assert dt.datetime.utcnow() == utc_time
You should be aware that this can have side effects in other parts of your code, so it might be needed to replace it back with the original class after the test method:
def test_patch_datetime():
datetime_orig = dt.datetime
utc_times = [
dt.datetime(2019, 1, 1, 10),
dt.datetime(2019, 2, 1, 13),
dt.datetime(2019, 3, 1, 16),
]
for utc_time in utc_times:
FakeTime.fake_time = utc_time
dt.datetime = FakeTime
assert dt.datetime.utcnow() == utc_time
dt.datetime = datetime_orig
# print(dt.datetime.utcnow())
assert dt.datetime.utcnow() > max(utc_times)
edited 20 hours ago
answered 21 hours ago
Maarten FabréMaarten Fabré
5,019417
5,019417
$begingroup$
thank you, but the methodstr_2_time
just need to show that all other methods of thedatetime
works fine.
$endgroup$
– Bear Brown
20 hours ago
add a comment |
$begingroup$
thank you, but the methodstr_2_time
just need to show that all other methods of thedatetime
works fine.
$endgroup$
– Bear Brown
20 hours ago
$begingroup$
thank you, but the method
str_2_time
just need to show that all other methods of the datetime
works fine.$endgroup$
– Bear Brown
20 hours ago
$begingroup$
thank you, but the method
str_2_time
just need to show that all other methods of the datetime
works fine.$endgroup$
– Bear Brown
20 hours ago
add a comment |
$begingroup$
Usually, I do:
- Separate module, for example
utils.py
, that contains:
from datetime import datetime
def get_utcnow() -> datetime:
return datetime.utcnow()
- Use this function everywhere in my code.
- Add the mocking fixture in
tests/conftest.py
:
from datetime import datetime, timedelta
import pytest
from .. import utils
@pytest.fixture
def mock_utcnow(monkeypatch):
now = datetime.min
def wrapped(delta=0.0):
when = now + timedelta(delta)
monkeypatch.setattr(utils, "get_utcnow", lambda: when)
return when
return wrapped
- Now it's easy to use it in your tests:
def test(mock_utcnow):
now = mock_utcnow()
new_now = mock_utcnow(0.1)
Additionally, with this fixture you can set the returning value with desired offset.
Hope it helps.
New contributor
$endgroup$
$begingroup$
thank you for the answer, but i don't understand how it should help for my case.
$endgroup$
– Bear Brown
14 hours ago
add a comment |
$begingroup$
Usually, I do:
- Separate module, for example
utils.py
, that contains:
from datetime import datetime
def get_utcnow() -> datetime:
return datetime.utcnow()
- Use this function everywhere in my code.
- Add the mocking fixture in
tests/conftest.py
:
from datetime import datetime, timedelta
import pytest
from .. import utils
@pytest.fixture
def mock_utcnow(monkeypatch):
now = datetime.min
def wrapped(delta=0.0):
when = now + timedelta(delta)
monkeypatch.setattr(utils, "get_utcnow", lambda: when)
return when
return wrapped
- Now it's easy to use it in your tests:
def test(mock_utcnow):
now = mock_utcnow()
new_now = mock_utcnow(0.1)
Additionally, with this fixture you can set the returning value with desired offset.
Hope it helps.
New contributor
$endgroup$
$begingroup$
thank you for the answer, but i don't understand how it should help for my case.
$endgroup$
– Bear Brown
14 hours ago
add a comment |
$begingroup$
Usually, I do:
- Separate module, for example
utils.py
, that contains:
from datetime import datetime
def get_utcnow() -> datetime:
return datetime.utcnow()
- Use this function everywhere in my code.
- Add the mocking fixture in
tests/conftest.py
:
from datetime import datetime, timedelta
import pytest
from .. import utils
@pytest.fixture
def mock_utcnow(monkeypatch):
now = datetime.min
def wrapped(delta=0.0):
when = now + timedelta(delta)
monkeypatch.setattr(utils, "get_utcnow", lambda: when)
return when
return wrapped
- Now it's easy to use it in your tests:
def test(mock_utcnow):
now = mock_utcnow()
new_now = mock_utcnow(0.1)
Additionally, with this fixture you can set the returning value with desired offset.
Hope it helps.
New contributor
$endgroup$
Usually, I do:
- Separate module, for example
utils.py
, that contains:
from datetime import datetime
def get_utcnow() -> datetime:
return datetime.utcnow()
- Use this function everywhere in my code.
- Add the mocking fixture in
tests/conftest.py
:
from datetime import datetime, timedelta
import pytest
from .. import utils
@pytest.fixture
def mock_utcnow(monkeypatch):
now = datetime.min
def wrapped(delta=0.0):
when = now + timedelta(delta)
monkeypatch.setattr(utils, "get_utcnow", lambda: when)
return when
return wrapped
- Now it's easy to use it in your tests:
def test(mock_utcnow):
now = mock_utcnow()
new_now = mock_utcnow(0.1)
Additionally, with this fixture you can set the returning value with desired offset.
Hope it helps.
New contributor
New contributor
answered 15 hours ago
S. ZobovS. Zobov
212
212
New contributor
New contributor
$begingroup$
thank you for the answer, but i don't understand how it should help for my case.
$endgroup$
– Bear Brown
14 hours ago
add a comment |
$begingroup$
thank you for the answer, but i don't understand how it should help for my case.
$endgroup$
– Bear Brown
14 hours ago
$begingroup$
thank you for the answer, but i don't understand how it should help for my case.
$endgroup$
– Bear Brown
14 hours ago
$begingroup$
thank you for the answer, but i don't understand how it should help for my case.
$endgroup$
– Bear Brown
14 hours ago
add a comment |
Bear Brown is a new contributor. Be nice, and check out our Code of Conduct.
Bear Brown is a new contributor. Be nice, and check out our Code of Conduct.
Bear Brown is a new contributor. Be nice, and check out our Code of Conduct.
Bear Brown is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Code Review Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
Use MathJax to format equations. MathJax reference.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f214816%2ffake-utcnow-for-the-pytest%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
$begingroup$
I highly recommend this lib for mocking
now
in python tests github.com/spulec/freezegun$endgroup$
– Anentropic
15 hours ago
$begingroup$
@Anentropic thank you, but if i will need more options i will add the package to the project
$endgroup$
– Bear Brown
14 hours ago