使用缓存装饰器在Python中运行单元测试

djsumdog

因此,我正在开发一个应用程序,该应用程序在导入某些记录时需要重新计算某些字段。为防止每次检查都读取数据库,有一个缓存装饰器,因此在导入期间每n秒仅执行一次数据库读取。麻烦来自构建测试用例。下面的方法确实有效,但是其中有一个丑陋的睡眠。

# The decorator I need to patch

@cache_function_call(2.0)
def _latest_term_modified():
    return PrimaryTerm.objects.latest('object_modified').object_modified


# The 2.0 sets the TTL of the decorator. So I need to switch out 
# self.ttl for this decorated function before 
# this test. Right now I'm just using a sleep, which works

    @mock.patch.object(models.Student, 'update_anniversary')
    def test_import_on_term_update(self, mock_update):
        self._import_student()
        latest_term = self._latest_term_mod()
        latest_term.save()
        time.sleep(3)
        self._import_student()
        self.assertEqual(mock_update.call_count, 2)

装饰器本身如下所示:

class cache_function_call(object):
    """Cache an argument-less function call for 'ttl' seconds."""
    def __init__(self, ttl):
        self.cached_result = None
        self.timestamp = 0
        self.ttl = ttl

    def __call__(self, func):
        @wraps(func)
        def inner():
            now = time.time()
            if now > self.timestamp + self.ttl:
                self.cached_result = func()
                self.timestamp = now
            return self.cached_result
        return inner

我试图在导入模型之前设置装饰器:

decorators.cache_function_call = lambda x : x
import models

但是,即使在文件的顶部,django仍会在运行my之前初始化模型,tests.py并且该函数仍会使用缓存装饰器(而不是我的lambda / noop)装饰。

编写此测试的最佳方法是什么,这样我就不用睡了。我可以在以某种方式运行导入之前设置装饰器的ttl吗?

亚历克斯·马特利

您可以稍微更改装饰器类。

在模块级别decorators.py设置全局

BAILOUT = False

在装饰器类中,更改:

def __call__(self, func):
    @wraps(func)
    def inner():
        now = time.time()
        if BAILOUT or now > self.timestamp + self.ttl:
            self.cached_result = func()
            self.timestamp = now
        return self.cached_result
    return inner

然后在您的测试集中decorators.BAILOUT = True,然后,嘿!!)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Python中使用装饰器跳过单元测试

来自分类Dev

使用装饰器和元类跳过所有单元测试,但跳过Python中的一项

来自分类Dev

通过使用装饰器和元类跳过所有单元测试,但跳过Python中的一个

来自分类Dev

如何在Python中删除(tearDown)单例实例装饰器以进行单元测试?

来自分类Dev

单元测试Typescript装饰器

来自分类Dev

在 Python 中运行单元测试模块

来自分类Dev

如何使用Atom编辑器运行Python单元测试?

来自分类Dev

如何在REPL中的Python中运行单元测试?

来自分类Dev

如何在SimpleInjector 2.6.1+中对开放的通用装饰器链进行单元测试

来自分类Dev

如何使用SimpleInjector 3+对装饰器注册进行单元测试?

来自分类Dev

如何使用Jasmine(Angular JS)对自定义装饰器进行单元测试

来自分类Dev

如何对使用环境变量的装饰器进行单元测试?

来自分类Dev

$ httpBackend装饰器后AngularJS单元测试失败

来自分类Dev

从main()在python中运行特定的单元测试

来自分类Dev

使用 assertAlmostEqual 的 Python 2.7 单元测试无法正常运行

来自分类Dev

使用ant在solr中运行单元测试用例

来自分类Dev

Flask 单击命令单元测试 - 如何使用带有“with_appcontext”装饰器的测试应用程序?

来自分类Dev

Python:单元测试未运行

来自分类Dev

在IntelliJ中运行Spark单元测试

来自分类Dev

在Haskell中自动运行单元测试

来自分类Dev

使用Maven运行Spock单元测试

来自分类Dev

使用PyDev运行单元测试

来自分类Dev

使用PyDev运行单元测试

来自分类Dev

Android单元测试缓存

来自分类Dev

在Python单元测试中测试stdout

来自分类Dev

缓存装饰器Python

来自分类Dev

如何在 ng2 单元测试中模拟 @Attribute 装饰器字符串提供程序?

来自分类Dev

使用TestScheduler对Akavache进行单元测试缓存行为

来自分类Dev

在Django中与单元测试分开运行集成测试

Related 相关文章

  1. 1

    在Python中使用装饰器跳过单元测试

  2. 2

    使用装饰器和元类跳过所有单元测试,但跳过Python中的一项

  3. 3

    通过使用装饰器和元类跳过所有单元测试,但跳过Python中的一个

  4. 4

    如何在Python中删除(tearDown)单例实例装饰器以进行单元测试?

  5. 5

    单元测试Typescript装饰器

  6. 6

    在 Python 中运行单元测试模块

  7. 7

    如何使用Atom编辑器运行Python单元测试?

  8. 8

    如何在REPL中的Python中运行单元测试?

  9. 9

    如何在SimpleInjector 2.6.1+中对开放的通用装饰器链进行单元测试

  10. 10

    如何使用SimpleInjector 3+对装饰器注册进行单元测试?

  11. 11

    如何使用Jasmine(Angular JS)对自定义装饰器进行单元测试

  12. 12

    如何对使用环境变量的装饰器进行单元测试?

  13. 13

    $ httpBackend装饰器后AngularJS单元测试失败

  14. 14

    从main()在python中运行特定的单元测试

  15. 15

    使用 assertAlmostEqual 的 Python 2.7 单元测试无法正常运行

  16. 16

    使用ant在solr中运行单元测试用例

  17. 17

    Flask 单击命令单元测试 - 如何使用带有“with_appcontext”装饰器的测试应用程序?

  18. 18

    Python:单元测试未运行

  19. 19

    在IntelliJ中运行Spark单元测试

  20. 20

    在Haskell中自动运行单元测试

  21. 21

    使用Maven运行Spock单元测试

  22. 22

    使用PyDev运行单元测试

  23. 23

    使用PyDev运行单元测试

  24. 24

    Android单元测试缓存

  25. 25

    在Python单元测试中测试stdout

  26. 26

    缓存装饰器Python

  27. 27

    如何在 ng2 单元测试中模拟 @Attribute 装饰器字符串提供程序?

  28. 28

    使用TestScheduler对Akavache进行单元测试缓存行为

  29. 29

    在Django中与单元测试分开运行集成测试

热门标签

归档