我似乎无法理解Python中的模拟。我有一个全局函数:
a.py:
def has_permission(args):
ret_val = ...get-true-or-false...
return ret_val
b.py:
->b.py:
class MySerializer(HyperlinkedModelSerializer):
def get_fields():
fields = super().get_fields()
for f in :
if has_permission(...):
ret_val[f.name] = fields[f]
return ret_val
c.py:
class CountrySerializer(MySerializer):
class Meta:
model = Country
问题: 现在我想测试c.py文件,但是我想mock a.py文件中定义的has_permission函数,该函数在b.py文件定义的MySerializer类的get_fields方法中被调用...我该如何做呢?
我已经尝试了以下方法:
@patch('b.MySerializer.has_permission')
和
@patch('b.MySerializer.get_fields.has_permission')
和
@patch('a.has_permission')
但无论我尝试什么,要么根本不起作用并且“has_permission”仍然被执行,要么Python会抱怨找不到属性“has_permission”。
使用以下修补程序:
test.py
class TestSerializerFields(TestCase):
@patch(... the above examples....)
def test_my_country_serializer():
s = CountrySerializer()
self..assertTrue(issubclass(my_serializer_fields.MyCharField, type(s.get_fields()['field1'])))
@patch('b.MySerializer.has_permission')
是错误的,因为has_permission
函数并不属于该类。你传递给patch
的是一个导入路径。微妙之处在于,虽然它在a.py
中定义,但一旦你在b.py
中导入它,它也可以从b.py
中导入……而且你想要修补的是从b.py
导入的副本。 - Anentropic