【问题标题】:Python Unit Test Mock import & check assert called withPython单元测试模拟导入和检查断言调用
【发布时间】:2021-09-06 13:57:34
【问题描述】:

我有一个类 ProductionClass 和一个方法 method_to_test 我想测试它。 ProductionClass 类依赖于 api,我想在测试中模拟它。

from my_module.apis import api
class ProductionClass:
     def method_to_test:
         data = api.method_to_mock()
         api.method_to_check_call(data)

测试代码如下: 对于api,我有一个模拟类MockApi,我通过在@patch 装饰器中引用它来使用它。

from unittest.mock import patch, MagicMock

class MockApi:
    def method_to_mock():
        return some_mock_data
    def method_to_check_call(data):
        pass

class TestClass:
    @patch('my_module.apis.api', MagicMock(return_value=MockApi()))
    def test_check_called_with(self):
         from module_of_class_production_class.ProductionClass import method_to_test
         mock_api = MockApi()
         method_to_test()
         some_data = { ... }
         mock.method_to_check_call.assert_called_with(some_data)
         

问题在于它不起作用,因为mock_apiMockApi 装饰器中提供的MockApi 实例不同。有没有更好的测试方法?

【问题讨论】:

    标签: python unit-testing magicmock


    【解决方案1】:

    我尚未对此进行测试,但我认为您的补丁对象将作为第一个参数传递给test_check_called_with,如下所示:

    @patch('my_module.apis.api', MagicMock(return_value=MockApi()))
    def test_check_called_with(self, your_magic_mock):
        # Rest of code
    

    您也可以像这样使用with 构造:

    def test_check_called_with(self):
        my_api = MockApi()
        with patch('my_module.apis.api', MagicMock(return_value=my_api)) as my_mock_api:
            # Your code here
    

    您可以在此处查看官方 python 文档以获取更多详细信息:https://docs.python.org/3/library/unittest.mock.html#quick-guide

    【讨论】:

      猜你喜欢
      • 2012-06-17
      • 2014-09-07
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2012-08-08
      • 2013-08-03
      相关资源
      最近更新 更多