Como mockar datetime.today()

latrova commited 1 ano, 9 meses ago
×

Eu estava com esse dilema esses dias. Havia um método que utilizava a data de hoje para determinar quais transações deveriam ser retornadas e não fazia ideia de como mockar esse tipo de coisa! Bom, depois de algumas pesquisas, aí está a fórmula:

views.py

from datetime import datetime

... #more code that uses datetime.today()

tests.py

Preste atenção ao mock.patch, ele sobrescreve o módulo datetime somente dentro da views.py.

from unittest import mock
... #more imports

@mock.patch('transactions.views.datetime', side_effect=lambda *args, **kw: date(*args, **kw))
def test_returns_only_from_current_month_by_default(self, mock_date):
    '''
    Returns only transactions from current month. Considering today is 15/02/2017
    '''
    mocked_today = datetime.datetime(2017, 2, 15)
    mock_date.today.return_value = mocked_today
    #old transactions
    self.create_transaction(value=self.value, due_date=datetime.date(2016, 12, 1))
    self.create_transaction(value=self.value, due_date=datetime.date(2017, 1, 1))
    #current month
    self.create_transaction(value=self.value, due_date=datetime.date(2017, 2, 1))
    self.create_transaction(value=self.value, due_date=datetime.date(2017, 2, 7))
    self.create_transaction(value=self.value, due_date=datetime.date(2017, 2, 8))
    self.create_transaction(value=self.value, due_date=datetime.date(2017, 2, 14))

    response = self.client.get(self.url)

    self.assertEqual(response.status_code, status.HTTP_200_OK)
    self.assertEqual(len(response.data), 4)
blog comments powered by Disqus