我必须创建并测试一些执行带时间戳的数据处理的库。为了实现它,我需要利用一些自己的压缩源并转移“虚拟”时间。对任何测试模块透明的最简单方法是使用我自己的实现简单地替换time.time()和time.sleep()(可能这两个就足够了)。但它安全,合理吗?
任何聪明的选择?
答案 0 :(得分:2)
是的,我已经完成了,它基本上和你想象的一样简单。我创建了一个名为FakeTime的类,它响应__call__
以提供当前时间,该时间是在属性中设置的。
然而,你可以做得更好。这种事情一直都在做;它被称为“嘲弄”。 This blog post嘲笑时钟,就像你想做的那样:
import unittest
from mock import *
from datetime import datetime, timedelta
import time
mock_time = Mock()
mock_time.return_value = time.mktime(datetime(2011, 6, 21).timetuple())
class TestCrawlerChecksDates(unittest.TestCase):
@patch('time.time', mock_time)
def test_mock_datetime_now(self):
self.assertEqual(datetime(2011, 6, 21), datetime.now())
mock
的{{1}}习惯了有点奇怪,但您可以将上述内容读作“在调用以下方法的过程中,将其引用交换为{{1}与@patch
。“
模拟time.time
:这取决于你想做什么。假设你只是想让它根本不睡觉:mock_time
应该可以工作。