构建处理redis和cache_method装饰器的测试

时间:2011-10-04 21:51:44

标签: python django unit-testing redis

所以我正在尝试使用redis为项目构建一些测试,但我有两种方法给我带来麻烦。

这两种方法都使用@cache_method()装饰器,并会发出类似于AssertionError: [] != []AsserionError: [<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 :(得分:0)

self.ObjectName.Method()是否返回QuerySet?如果不是,我怀疑这是你的问题。 ObjectName.objects.filter(...)将返回QuerySet。如果你的方法返回任何其他东西,那么断言自然会失败。

更具体地说,ObjectName.objects.none()将返回一个django.db.models.query.EmtpyQuerySet,而filter()将返回django.db.models.query.EmptyQuerySetdjango.db.models.query.QuerySet,具体取决于具体内容,如果有的话,匹配过滤器。

所以在某处您似乎正在尝试比较ObjectName.method():   a)不返回QuerySet但不同的东西     -要么-   b)在期望EmptyQuerySet时返回QuerySet(例如当调用none()时),反之亦然。

由于我们不知道ObjectName.method()是什么或它返回什么,因此您需要查看那些/那些方法以查看它返回的内容以及可能的原因。

我希望指出你正确的方向。