【问题标题】:update a mocked object in python更新python中的模拟对象
【发布时间】:2020-12-08 21:40:42
【问题描述】:

我创建了一个模拟对象,如下所示:

    with patch('requests.get') as request:
      self.request = request
      self.request.session = MockSession()
      self.request.cookies = {}

如何通过其他函数更新

【问题讨论】:

  • set_nonce 中的值如何更新?
  • @asaf92:更新了我的问题中的方法
  • 你在哪里打补丁?您使用的是unittest 还是pytest?请注意,超出范围后修补会恢复 - 根据您的结构,这可能是您的问题。
  • @MrBeanBremen 我不确定我是否理解如何修补它。我正在使用单元测试。您能否分享一下在这个示例中我将如何修补?

标签: python unit-testing mocking tdd


【解决方案1】:

如果你想保存一个打补丁的对象,你必须手动开始和停止打补丁。如果您使用上下文管理器(例如with patch),则补丁将在退出范围时恢复。
以下是您可以执行的操作:

class TestSomething(unittest.TestCase):
    def setUp(self):
      self.patcher = patch('requests.get')  # returns the patcher object
      self.request = self.patcher.start()  # returns the patched object
      self.request.session = MockSession()
      self.request.cookies = {}

    def tearDown(self):
        sef.patcher.stop()

    def test_03_set_nonce(self):
        self.web_session.set_nonce(self.request)
        self.assertTrue(len(self.request.cookies) > 0, 'set_nonce failed.')

请注意,我没有检查实际测试 - 这取决于您的应用程序逻辑。

你也可以直接在测试中打补丁:

    @patch('requests.get')
    def test_03_set_nonce(self, request):
        request.session = MockSession()
        request.cookies = {}
        self.web_session.set_nonce(request)
        self.assertTrue(len(request.cookies) > 0, 'set_nonce failed.')

【讨论】:

  • 感谢分享。刚刚更新了我的测试类现在的样子,但 request.cookies 仍然失败
  • 您正在使用模拟对象调用 set_nonce - addCookie 除了记录调用之外不会做任何事情。如果你想测试函数的行为,你不能模拟它。
  • 好的。在这种情况下我应该在这里做什么?什么情况下应该在这里使用模拟?我觉得有点失落
  • 好吧,我不知道你的代码,但你必须弄清楚你想测试什么以及你想模拟什么。也许您不想模拟request.get(您将其命名为request,这有点令人困惑),但只有会话?通常,显示您要测试的代码(或minimal reproducible example)会有所帮助,并阐明您要测试的内容。
  • 所以我知道您在编辑 3 中的测试代码是工作代码,您只想使用 mock.patch 重构它?我今天晚些时候可能会仔细看看,现在必须运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多