首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >模拟time.time()进行扭曲试验测试

模拟time.time()进行扭曲试验测试
EN

Stack Overflow用户
提问于 2014-06-14 11:09:28
回答 1查看 2.2K关注 0票数 0

我使用的是mock==1.0.1和python2.7.3版本,并使用扭曲的试用版来运行测试。扭曲版本: 13.2.0

我正在用inlineCallbacks装饰器为函数编写一个模拟测试。函数使用time() from time模块,我希望模拟这一点,因为函数的返回值取决于返回的时间。我要断言返回值。

因此,我添加了一个@修补程序装饰器,但是模拟测试没有被执行(没有显示在执行测试的列表中)。这是密码-

代码语言:javascript
运行
复制
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()函数

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-14 12:04:39

而不是嘲笑,参数化。

代码语言:javascript
运行
复制
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)

猴补球和参数化差不多,只是做得不太好。您不需要来替换整个流程的时间模块(甚至是一个模块中的所有代码)。你只需要把它替换为被测试的单元。最简单的方法是将它作为参数传递。

还有一些其他的事情,你可能也想做。这适用于您是否使用嘲弄和猴子补丁或参数。

当您没有对代码进行修改时,您希望测试它是否有效。毕竟,这就是它在生产中的运行方式,您实际上希望它能够在生产中运行。

代码语言:javascript
运行
复制
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伪。

代码语言:javascript
运行
复制
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)

在这种情况下,我不想提供默认的反应堆。你可以,但明确通过反应堆是一个很好的主意,在一般情况下,所以我通常不提供违约。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24219316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档