tri*_*het 4 python testing django timing mocking
我想嘲笑时刻,以便能够设定一定的时间类型的字段DateTimeField
用auto_now_add=True
在我的测试,例如:
class MyModel:
...
created_at = models.DateTimeField(auto_now_add=True)
...
class TestMyModel(TestCase):
...
def test_something(self):
# mock current time so that `created_at` be something like 1800-02-09T020000
my_obj = MyModel.objects.create(<whatever>)
# and here my_obj.created_at == 1800-02-09T000000
Run Code Online (Sandbox Code Playgroud)
我知道当前日期总是用于这种类型的字段,这就是为什么我正在寻找一种替代方法来模拟系统时序,但只是在上下文中.
我已经尝试了一些方法,例如,创建一个上下文freeze_time
但没有工作:
with freeze_now("1800-02-09"):
MyModel.objects.create(<whatever>)
# here the created_at doesn't fit 1800-02-09
Run Code Online (Sandbox Code Playgroud)
我想,这是因为当对象创建的方式背后的机制auto_now_add=True
.
我不想删除auto_now_add=True
并使用默认值.
有没有办法我们可以模拟时间,以便我们可以做到这一点,这种领域在某些情况下得到我想要的时间?
我正在使用Django 1.9.6
和Python 3.4
tri*_*het 10
好的,我找到了一个解决方案,它基于mock:
def mock_now():
return <mock time>
class TestMyModel(TestCase):
...
@mock.patch('django.utils.timezone.now', mock_now)
def test_as_decorator(self):
...
my_obj = MyModel.objects.create(<whatever>)
...
# here the created_at field has the mocking time :)
def test_as_context_manager(self):
mocked_dt = datetime.datetime(2015, 9, 3, 11, 15, 0)
with mock.patch('django.utils.timezone.now', mock.Mock(return_value=mocked_dt)):
my_obj = MyModel.objects.create(<whatever>)
# here the created_at field has the mocking time :)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1023 次 |
最近记录: |