我使用的是mock==1.0.1和python2.7.3版本,并使用扭曲的试用版来运行测试。扭曲版本: 13.2.0
我正在用inlineCallbacks装饰器为函数编写一个模拟测试。函数使用time() from time模块,我希望模拟这一点,因为函数的返回值取决于返回的时间。我要断言返回值。
因此,我添加了一个@修补程序装饰器,但是模拟测试没有被执行(没有显示在执行测试的列表中)。这是密码-
CURRENT_TIME = time.time()
@patch('my_module.time')
@defer.inlineCallbacks
def test_index(self, mock_time):
mock_time.time.return_value = CURRENT_TIME
handler = ClassToTest()
result = yield handler.toTestFunc("")
assertEqual(result, {"time":CURRENT_TIME, "values":4})我的问题是--由trial test.py运行测试,运行除test_index之外的所有其他测试。在注释掉修补程序装饰器时,测试将运行并给出一个错误。我读过打补丁的地方部分,但仍然不知道如何修补time.time()函数。我应该如何模拟测试的time.time()函数
发布于 2014-06-14 12:04:39
而不是嘲笑,参数化。
from time import time
class ClassToTest(object):
def __init__(self, time=time):
self._time = time
def toTestFunc(self, arg):
return {"time": self._time(), "values": 4}
def test_index(self):
sut = ClassToTest(lambda: CURRENT_TIME)
result = self.successResultOf(sut.toTestFunc(""))
self.assertEqual({"time": CURRENT_TIME, "values": 4}, result)猴补球和参数化差不多,只是做得不太好。您不需要来替换整个流程的时间模块(甚至是一个模块中的所有代码)。你只需要把它替换为被测试的单元。最简单的方法是将它作为参数传递。
还有一些其他的事情,你可能也想做。这适用于您是否使用嘲弄和猴子补丁或参数。
当您没有对代码进行修改时,您希望测试它是否有效。毕竟,这就是它在生产中的运行方式,您实际上希望它能够在生产中运行。
from time import time
def test_default_time_function(self):
sut = ClassToTest()
before = time()
result = self.successResultOf(sut.toTestFunc(""))
after = time()
# Possibly not ideal, but seems to work okay in practice and I haven't
# had any better ideas for how to make assertions about `time()`
self.assertTrue(before <= result["time"] <= after)由于您使用的是Twisted,您可能还想了解IReactorTime.seconds API和twisted.internet.task.Clock伪。
from twisted.internet.task import Clock
class ClassToTest(object):
def __init__(self, reactor):
self._reactor = reactor
def toTestFunc(self, arg):
return {"time": self._reactor.seconds(), "values": 4}
def test_index(self):
when = 123456.7
reactor = Clock()
reactor.advance(when)
sut = ClassToTest(reactor)
result = self.successResultOf(sut.toTestFunc(""))
self.assertEqual({"time": when, "values": 4}, result)在这种情况下,我不想提供默认的反应堆。你可以,但明确通过反应堆是一个很好的主意,在一般情况下,所以我通常不提供违约。
https://stackoverflow.com/questions/24219316
复制相似问题