Python 一个单元测试应该对它正在测试的功能了解多少?

Python 一个单元测试应该对它正在测试的功能了解多少?,python,unit-testing,caching,flask,Python,Unit Testing,Caching,Flask,我正在为缓存机制编写一个测试。该机制有两个缓存层,请求缓存和redis。请求缓存使用Flask.g,该对象存储请求期间的值。它通过在Flask.g.\u cache属性上创建字典来实现这一点 然而,我认为确切的属性是我的单元测试不应该关心的实现细节。我想确保它将其值存储在Flask.g上,但我不关心它是如何做到的。什么是测试这个的好方法 我使用的是Python模拟模块,所以我知道我可以模拟'Flask.g,但我不确定是否有方法可以测试它是否有任何属性访问,而不关心它是哪个属性 对于这样的测试,这

我正在为缓存机制编写一个测试。该机制有两个缓存层,请求缓存和redis。请求缓存使用
Flask.g
,该对象存储请求期间的值。它通过在
Flask.g.\u cache
属性上创建字典来实现这一点

然而,我认为确切的属性是我的单元测试不应该关心的实现细节。我想确保它将其值存储在Flask.g上,但我不关心它是如何做到的。什么是测试这个的好方法

我使用的是Python模拟模块,所以我知道我可以模拟'Flask.g,但我不确定是否有方法可以测试它是否有任何属性访问,而不关心它是哪个属性


对于这样的测试,这是正确的方法吗?

就个人而言,如果要测试端点,就不应该模仿Flask.g。因为您将创建一个self.app(我可能不确定这部分)

其次,您需要模拟redis客户机,使用类似这样的内容作为返回的结构

class RedisTestCase(object):
    saved_dictionary = {}
    def keys(self, pattern):
        found_keys = []
        for key in RedisTestCase.saved_dictionary: #loop keys for pattern
            if pattern:
                found_keys.append(key)
        return found_keys

    def delete(self, keys):
        for key in keys:
            if key in RedisTestCase.saved_dictionary:
                del RedisTestCase.saved_dictionary[key]

    def mset(self, items):
        RedisTestCase.saved_dictionary.update(items)

    def pipeline(self):
        return RedisTestCase()

与其查看测试中缓存的具体情况,不如确保
昂贵的\u op\u 1
昂贵的\u op\u 2
不会被多次调用?数据缓存在哪里并不重要(就测试而言),关键是数据是否被缓存并重新使用,而不是您想要测试的重新请求。(或者我误解了你的问题?)嗯,请求缓存比去redis快得多。