在类中使用的 python 模拟全局函数

标签 python unit-testing mocking

我似乎无法理解 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中定义的has_permission函数,但在get_fields中调用- 在 b.py 中定义的类 MySerializer 的方法...我该怎么做?

我试过这样的事情:

@patch('b.MySerializer.has_permission')

@patch('b.MySerializer.get_fields.has_permission')

@patch('a.has_permission')

但是我尝试的所有方法要么不起作用并且 has_permission 仍在执行,要么 python 提示它找不到属性“has_permission”

补丁完成时间:

测试.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'])))

最佳答案

您需要在 b 模块中修补全局:

@patch('b.has_permission')

因为这是您的代码查找它的地方。

另见 Where to patch section mock 文档。

关于在类中使用的 python 模拟全局函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31984449/

相关文章:

python - 将 python 脚本转换为 .exe 时出现 "ImportError: No module named xlsxwriter"

unit-testing - 为什么 `assert_eq` 和 `assert_ne` 存在,而简单的 `assert` 就足够了?

c# - 为什么 RhinoMocks 在 VB 和 C# 中表现不同?

python - 如何在 Python 中对数据框的特定行求和

python - 扭曲的,延迟的完整回溯

python - 安装scrapy时出错

javascript - JestJS:如何获得模拟函数的不同 promise 结果并测试抛出的错误?

windows - 伪造一个 RS232 串口

tdd - 模拟 XMPP 服务器的建议

java - 我可以在 Citrus 静态响应适配器负载中使用 Citrus 变量吗?