【问题标题】:How do I mock a function which is imported with an alias?如何模拟使用别名导入的函数?
【发布时间】:2020-05-28 19:11:31
【问题描述】:

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

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

我尝试过的事情:

  • http://bhfsteve.blogspot.com/2012/06/patching-tip-using-mocks-in-python-unit.html这并没有给出具体的问题解决方案。
  • a.dummy.class.function.alias 修补为a.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

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

【问题讨论】:

    标签: python unit-testing mocking


    【解决方案1】:

    您需要模拟对象所在的位置。如果您将模块/函数导入到 file.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
    

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

    【讨论】:

    • 很好的答案。我认为它应该被接受。
    【解决方案2】:

    为了补充 Mauro Baraldi 的回答,这就是使用装饰器的方法。

    @patch("__main__.alias")
    

    【讨论】:

      猜你喜欢
      • 2017-02-06
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多