模拟时间。时间()用于扭曲试验

2024-10-06 12:14:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用mock==1.0.1和pythonversion2.7.3,并使用twisted trial来运行测试。Twisted版本:13.2.0

我正在用inlineCallbacks decorator为函数编写一个模拟测试。 该函数使用time模块中的time(),我希望对此进行模拟,因为函数的返回值取决于返回的时间。我想断言返回值。在

所以,我添加了一个@patch decorator,但是模拟测试没有被执行(没有出现在执行的测试列表中)。这是密码-

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\u index之外的所有其他测试。在注释掉补丁装饰器时,测试运行并给出一个错误。我读了Where to patch部分,但仍然不知道如何修补时间。时间()功能。我该如何模仿时间。时间()测试功能


Tags: 函数testindextime时间decoratorresultcurrent
1条回答
网友
1楼 · 发布于 2024-10-06 12:14:56

不是模仿,而是参数化。在

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)

Monkey-patching globals与参数化是一回事,只是做得不太好。您不需要在整个流程(甚至一个模块中的所有代码)中替换时间模块。你只需要为被测单元更换它。最直接的方法是将其作为参数传递。在

你可能还想做一些其他的事情。无论使用mocking和monkey-patching还是参数,这都适用。在

你想测试代码在你还没搞定它的时候能不能正常工作。毕竟,这就是它在生产中的运行方式,在那里您实际上希望它能够工作。在

^{pr2}$

因为您使用的是Twisted,所以您可能还想知道IReactorTime.secondsAPI和twisted.internet.task.Clock伪API。在

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)

在这种情况下,我没有费心提供一个默认的反应堆。你可以,但是显式地通过反应堆是一个很好的主意,所以我通常不提供违约。在

相关问题 更多 >