我如何模拟修补嵌套方法调用
How do i mock patch a nested method call
所以这是一个我想解决的 'complex' 测试用例。
我有一个名为 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()
所以成功了...
通过这样的测试:
@patch.object(Store, 'get_orders')
@patch.object(Marketplace, 'get_open_orders')
def test_get_orders_marketplace(self, mock_get_id, mock_get):
....
所以这是一个我想解决的 'complex' 测试用例。
我有一个名为 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()
所以成功了...
通过这样的测试:
@patch.object(Store, 'get_orders')
@patch.object(Marketplace, 'get_open_orders')
def test_get_orders_marketplace(self, mock_get_id, mock_get):
....