def test_set_now(self): """ 1. 重设 clock_engine 的时间 2. 通过 mock 来重设时间戳 3. mock 只能重设 time.time 函数的时间戳,但是不能重设 datetime.datetime.now 函数的时间戳,详情见: http://stackoverflow.com/questions/4481954/python-trying-to-mock-datetime-date-today-but-not-working 4. 在代码中需要使用时间戳时,请通过 clock_engine 中的 now 或者 now_dt 接口获得,也可以使用 time.time 获得.否则该段代码将不适用于需要更改时间戳的单元测试 :return: """ tzinfo = tz.tzlocal() # 使用datetime 类构建时间戳 now = datetime.datetime(2016, 7, 14, 8, 59, 50, tzinfo=tzinfo) # 通过mock ,将 time.time() 函数的返回值重设为上面的打算模拟的值,注意要转化为浮点数时间戳 time.time = mock.Mock(return_value=now.timestamp()) # 生成一个时钟引擎 clock_engien = ClockEngine(EventEngine(), tzinfo) # 去掉微秒误差后验证其数值 self.assertEqual(clock_engien.now, now.timestamp()) # time.time 时间戳 self.assertEqual(clock_engien.now_dt, now) # datetime 时间戳 # 据此可以模拟一段时间内各个闹钟事件的触发,比如模拟开市9:00一直到休市15:00 for _ in range(60): clock_engien.tock() now += datetime.timedelta(seconds=1) # 每秒触发一次 tick_tock time.time = mock.Mock(return_value=now.timestamp()) self.assertEqual(clock_engien.now, now.timestamp()) # time.time 时间戳 self.assertEqual(clock_engien.now_dt, now) # datetime 时间戳
def test_set_now(self): """ 重设 clock_engine 的时间 :return: """ tzinfo = tz.tzlocal() now = datetime.datetime.combine( self.trade_date, datetime.time(8, 59, 00, tzinfo=tzinfo), ) clock_engien = ClockEngine(EventEngine(), now, tzinfo) # 去掉微秒误差后比较 self.assertEqual(clock_engien.now_dt.replace(microsecond=0), now)
def test_reset_now(self): """ 重设时钟引擎当前时间为其他时间点 :return: """ tzinfo = tz.tzlocal() clock_engien = ClockEngine(EventEngine()) now = datetime.datetime.combine( self.trade_date, datetime.time(8, 59, 00, tzinfo=tzinfo), ) clock_engien.reset_now(now) # 去掉微秒误差后比较 self.assertEqual(clock_engien.now_dt.replace(microsecond=0), now) # 重设为当前时间 clock_engien.reset_now() now = datetime.datetime.now(tzinfo).replace(microsecond=0) # 去掉微秒误差后比较 self.assertEqual(clock_engien.now_dt.replace(microsecond=0), now)