构建与Redis和cache_method装饰器相关的测试
我正在为一个使用 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 个回答
你问的 self.ObjectName.Method()
是不是返回一个查询集(QuerySet)?如果不是,那可能就是你遇到的问题所在。ObjectName.objects.filter(...)
会返回一个查询集。如果你的方法返回的是其他东西,自然就会导致断言失败。
更具体来说,ObjectName.objects.none()
会返回一个空查询集(EmptyQuerySet),而 filter()
则会根据过滤条件返回一个空查询集或者一个正常的查询集,这取决于有没有符合条件的结果。
所以看起来你在某个地方试图比较 ObjectName.method()
,但它可能是:
a) 没有返回查询集,而是返回了其他东西
-或者-
b) 返回了查询集,但本来应该返回空查询集(比如调用了 none() 的时候),或者反过来。
因为我们不知道 ObjectName.method()
是什么,也不知道它返回了什么,所以你需要查看这个方法,看看它到底返回了什么,以及可能的原因。
希望这些能帮你找到问题的方向。