【问题标题】:How to mock function for call multiple time如何模拟多次调用的函数
【发布时间】:2022-11-02 19:22:23
【问题描述】:

我想在单元测试中使用模拟函数。

例如:

def b():
    return False


def a():
    b1 = b()
    b2 = b()
    .....

我想在第一次调用 b() 时看到“False”,在第二次调用 b() 时看到“True” 或在其他示例中调用“find_one”函数两次

def check_item(user_id:str,item_id):
    # at first check user exist or not
    user=db.find_one('user',user_id)
    if not user:
        return False
    item=db.find_one('item',item_id)
    if not item:
        return False
    return True

(我知道这不是处理检查项目的好方法,应该创建一个单独的函数并向它们添加自己的逻辑:D)

对于模拟“find_one”函数,我们认为在第一次调用时需要的不是 none,而在第二次调用时应该看到 none。

【问题讨论】:

    标签: python mocking python-unittest


    【解决方案1】:

    对于handel这个问题,我使用“unittest.mock”包中的“patch”函数并使用Mock.side_effect。 当我们使用 side_effect 时,可以定义在第一次调用某个函数时返回此模拟数据,并在第二次函数调用时返回其他内容。 要了解有关 side_effect 的更多信息,请参阅url

    from unittest.mock import patch
    
    mock_user_data={'name':'John',....}
    mock_item_data={'item_name':'Pen',...}
    m = Mock()
    m.side_effect = iter([mock_user_data,None ])
    
    @patch('check_item',m)
    def test_check_item_function_with_nothnig_found_item():
        result = check_item(user_id='sdsas-sdsas-fdf52',item_id=2)
        assert result is False
    
    
    
    

    现在通过模拟一个函数并多次调用可以根据需要模拟返回数据



    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多