簡體   English   中英

在python函數中模擬具有不同返回值的相同方法兩次

[英]Mock same method with different return value called twice in a function in python

我有一種方法可以使用pytest進行測試。 該方法兩次調用相同的數據庫模型。

 def function:
    ids = database_model.object.filter(user="user1").filter(group="admin").values_list(ids, flat=True).allow_filtering()
    response_list = []
    unquie_ids = list(set(ids))
    for ids in unique_ids:
        response = database_model.object.filter(ids=ids).limit(1)
        for res in response:
            temp_dict = {}
            temp_dict['name'] = res.name
            temp_dict['description'] = res.description
            response_list.append(temp_dict)
   return response_list

這很好。 我正打算為此編寫單元測試用例。 由於相同的database_model需要兩次返回值。 它對我不起作用。

  @patch('database_model')
  def test_function(mock_model):
      mock_model.objects.filter.return_value.filter.return_value.values_list.return_value.allow_filtering_return_value = [Mock_id]
      mock_model.objects.filter.limit.return_value = mock_dict

      response = function()

      assert len(response) > 0

mock_id和mock_dict是為測試用例創建的值。 我的問題是我第一次將return_value分配給[Mock_id]正確分配的嘲笑模型[mock_id]的嘲笑模型。對象。過濾器。返回值。過濾器。返回值。數值。清單。返回值。允許_過濾。返回值。 但是下一行我試圖再次將return_value分配給相同的方法。 這作為魔術模擬對象。 所以我的測試用例失敗了,因為它得到了一個空列表。 我想知道如何將兩個不同的return_value分配給同一方法。

您應該為database_model.object.filter模擬編寫一個side_effect ,該模擬為您提供了一個Mock()Mock()配置為在模擬之后返回正確的ids列表以用於循環。

mock_filter_get_ids = Mock()
mock_filter_ids = Mock()
mock_model.objects.filter.side_effect = [mock_filter_get_ids, mock_filter_ids]
mock_filter_get_ids.filter.return_value.values_list.return_value.allow_filtering_return_value = [Mock_id]
mock_filter_ids.limit.return_value = mock_dict

但...

忘記了:重構代碼,至少提取以下內容:

database_model.object.filter(user="user1").filter(group="admin").values_list(ids, flat=True).allow_filtering()

在類似get_user_ids()

database_model.object.filter(ids=ids).limit(1)

get_ids_response()

您可以模擬新方法並使代碼更易於閱讀,易於測試意味着幾乎每次都易於閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM