构建与Redis和cache_method装饰器相关的测试

1 投票
1 回答
756 浏览
提问于 2025-04-17 03:40

我正在为一个使用 Redis 的项目编写一些测试,但有两个方法让我很头疼。

这两个方法都用了 @cache_method() 这个装饰器,测试时会出现类似 AssertionError: [] != []AssertionError: [<ObjectName: instance_name>] != [<ObjectName: instance_name>] 的错误报告。我的测试大致是这样的:

self.assertEquals(self.ObjectName.Method(), ObjectName.objects.none())

或者

self.assertEquals(self.ObjectName.Method(), ObjectName.objects.filter(...))

如果我使用像 self.assertEquals(type(), type()) 这样的代码,测试就能通过,所以我完全搞不懂问题出在哪里。

我的测试类看起来是这样的:

class SimpleTest(TestCase):

    def setUp(self):
        self.reset_pool()
        self.cache = self.get_cache()
        self.cache.clear()

        ... setup a bunch of self.Object instances for the actual tests ...

    def reset_pool(self):
        if hasattr(self, 'cache'):
            self.cache._client.connection_pool.disconnect()

    def get_cache(self, backend=None):
        if VERSION[0] == 1 and VERSION[1] < 3:
            cache = get_cache(backend or 'redis_cache.cache://127.0.0.1:6379?db=15')
        elif VERSION[0] == 1 and VERSION[1] >= 3:
            cache = get_cache(backend or 'default')
        return cache

我该如何让这些测试通过呢?

1 个回答

0

你问的 self.ObjectName.Method() 是不是返回一个查询集(QuerySet)?如果不是,那可能就是你遇到的问题所在。ObjectName.objects.filter(...) 会返回一个查询集。如果你的方法返回的是其他东西,自然就会导致断言失败。

更具体来说,ObjectName.objects.none() 会返回一个空查询集(EmptyQuerySet),而 filter() 则会根据过滤条件返回一个空查询集或者一个正常的查询集,这取决于有没有符合条件的结果。

所以看起来你在某个地方试图比较 ObjectName.method(),但它可能是: a) 没有返回查询集,而是返回了其他东西 -或者- b) 返回了查询集,但本来应该返回空查询集(比如调用了 none() 的时候),或者反过来。

因为我们不知道 ObjectName.method() 是什么,也不知道它返回了什么,所以你需要查看这个方法,看看它到底返回了什么,以及可能的原因。

希望这些能帮你找到问题的方向。

撰写回答