【问题标题】:How do i mock patch a nested method call我如何模拟修补嵌套方法调用
【发布时间】:2021-03-30 16:29:34
【问题描述】:

所以这是一个我想要解决的相当“复杂”的测试用例。

我有一个名为 Store 的 Django 模型,该商店有许多方法和字段。我想测试一下Store Model的具体方法,求get_orders(self)

get_orders(self) 方法通过模块实例调用外部 API。

所以我们有了 MarketPlace 模块。该 Marketplace 模块有几种方法,例如 get_orders()、create_order() 等。

Store 模型有一个属性,它是 Marketplace 模块的一个实例,并且通过该路径调用该方法。我如何测试Store.get_orders(self)

#/app/stores/models.py

class Store(models.Model):
    store_name = models.CharField(max_length=100, blank=False)
    marketplace_api_key = models.CharField(max_length=100, blank=False)
    
    @property
    def marketplace_instance(self):
        markets = MarketPlace(api_key=self.marketplace_api_key )
        return market

    def get_orders(self):
        # this is the method i want to mock
        open_orders = self.marketplace_instance.get_open_orders()

#/app/controllers/MarketPlace/MarketPlace.py

class MarketPlace(models.Model):
    api_key = models.CharField(max_length=100, blank=False)
    
    def get_open_orders(self):
        url = f'https://marketplace.com/?apikey={self.api_key}'
        r = requests.get(url, headers=headers)
        
        if r.status_code == 200:
            return r.json()
        else:
            return None

#/app/stores/tests/test_models.py

class StoreTests(TestCase):

    @classmethod
    def setUpTestData(cls):
        cls.store = StoreFactory()
        cls.mock_open_order_patcher = patch('controllers.MarketPlace.Marketplace.MarketPlace.get_open_orders')
        cls.mock_open_order = cls.mock_open_order_patcher .start()

    @classmethod
    def tearDown(cls) -> None:
        cls.mock_open_order_patcher .stop()

   def test_get_orders_marketplace(self):
       orders_response = {}
      
       self.mock_open_order.return_value = MagicMock(ok=True)
       self.mock_open_order.return_value.json.return_value = orders_response
       assert self.store.get_orders()       

【问题讨论】:

    标签: python django unit-testing pytest pytest-mock


    【解决方案1】:

    所以成功了……

    通过这样的测试:

    @patch.object(Store, 'get_orders')
    @patch.object(Marketplace, 'get_open_orders')
    def test_get_orders_marketplace(self, mock_get_id, mock_get):
        ....
    

    【讨论】:

      猜你喜欢
      • 2018-11-10
      • 1970-01-01
      • 2020-06-17
      • 2022-07-06
      • 2017-06-03
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多