python - 如何模拟使用别名导入的函数?

标签 python unit-testing mocking

下面我添加了一些虚拟代码,它们完全代表我正在尝试做的事情。

我正在从具有别名的类中导入函数,我这样做是因为该类本身正在运行别名版本。

我尝试过的事情:

  • http://bhfsteve.blogspot.com/2012/06/patching-tip-using-mocks-in-python-unit.html这并没有给出问题的具体解决方案。
  • 已修补 a.dummy.class.function.aliasa.dummy.class.function这允许执行但不会像在类中那样运行 alias_function_mocker() 函数被称为 alias() 而不是 function()
  • 我尝试以 a.dummy.class.function.alias 的身份运行但这会导致属性错误,因为别名实际上不是类的属性(因为 function() 是)
  • from a.dummy.class import function as alias
    
    def alias_function_mocker():
        return 0
    
    @patch("a.dummy.class.function.alias", side_effect=alias_function_mocker):
    def test_function(mocked_function):
        function_calling_alias()
        return 0
    
    

    我认为问题的根源在于类文件正在使用别名调用函数,并且似乎没有办法修补别名函数调用。我能想到的最简单和最天真的解决方案就是不使用别名。

    最佳答案

    您需要模拟对象所在的位置。如果您将模块/函数导入到 文件.py ,你需要模拟这个文件的对象。

    如果您在方法的同一文件中使用测试,这可能是解决方案:

    from os.path import isdir as is_it_a_dir
    from unittest.mock import patch
    
    def check(path):
        return is_it_a_dir(path)
    
    with patch('__main__.is_it_a_dir') as mock_isitadir:
        mock_isitadir.return_value = True
        assert check('/any/invalid/path') == True
    

    如果您的测试在另一个文件中,那么您的方法应该可以工作。

    关于python - 如何模拟使用别名导入的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62072714/

    相关文章:

    Ubuntu : how to catch out of memory exceptions? 上的 python

    python - 从python中的c dll获取char数组作为字符串

    python - 在 Python subprocess.call() 中转义特殊字符 (*)

    java - 运行 Roboelectric 单元测试时出现 NoClassDefFoundError

    ruby-on-rails - RSpec - stub 实例方法

    python - 注册要在函数退出时执行的函数

    c# - 使用 MSTest 仅运行所有测试集的一部分

    unit-testing - Unicode Clojure 单元测试输出

    unit-testing - 如何避免从模拟对象列表中返回模拟

    python - 如何在 django 中模拟外部 api?