Dom*_*Dom 2 python unit-testing timestamp nose
我正在构建一个设备对象来从python中连接设备轮询数据,我正在尝试使用nose测试对象及其所有功能的交互操作.我在编写时间戳时遇到问题,time.time()因为每次调用函数时结果值都不同,这严重搞砸了一些测试,例如这个数据收集函数:
def getData(self, data):
if type(data) is not type({}):
#print "Bad Type!"
raise TypeError
else:
#print "Good Type!"
self.outD = {}
datastr = ""
for key, value in data.iteritems():
self.outD[key] = value
self.outD["timestamp"] = time.time()
self.outD["id"] = self.id
self._writeCSV()
Run Code Online (Sandbox Code Playgroud)
当我测试此函数的输出并比较生成的CSV文件时,它总是因时间戳而失败.我可以通过添加测试标志在我的设备对象中将其分出来,但我想知道是否有一个内置的方法来处理这样的问题,其中函数的结果可以用给定的值替换或本地函数伪造的time.time()通话.这可能吗?
And*_*ini 12
你可以用unittest.mock.例:
import time
from unittest import mock
@mock.patch('time.time', mock.MagicMock(return_value=12345))
def test_something():
assert time.time() == 12345
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
$ nosetests3 -v
test.test_something ... ok
----------------------------------------------------------------------
Ran 1 test in 0.006s
OK
Run Code Online (Sandbox Code Playgroud)
尽管这mock是该unittest软件包的一部分,但它实际上是无关的,适用于任何测试框架.
对于Python <3.3,您可以使用mockPyPI中的包.
这是从 AC 的先前答案中得出的。没有必要显式创建MagicMock. 其次,mock 的使用按照惯例断言以确保其使用。
import time
import unittest.mock
@unittest.mock.patch('time.time', return_value=12345)
def test_foo(mock_time):
assert time.time() == 12345
mock_time.assert_called_once()
Run Code Online (Sandbox Code Playgroud)
这是使用 Python 3.7 进行测试的。