【发布时间】:2015-08-13 09:30:35
【问题描述】:
我似乎无法在 Python 中模拟。我有一个全局函数:
a.py:
def has_permission(args):
ret_val = ...get-true-or-false...
return ret_val
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,但我想模拟 a.py 中定义但在 get_fields 中调用的 has_permission 函数-b.py 中定义的 MySerializer 类的方法...我该怎么做?
我尝试过类似的方法:
@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? -
@vks:大概是在测试中。
-
@patch('b.MySerializer.has_permission')是错误的,因为has_permission函数不属于该类。你传递给patch的是一个导入路径。微妙之处在于,虽然在a.py, once you've imported it inb.py` 中定义,但它也可以从b.py导入......而且它是在b.py中导入的副本,您要修补
标签: python unit-testing mocking