如何在Python中模拟类,以便将其转换为列表?

2024-09-30 16:41:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个例子,我为其编写单元测试的方法中有一些类实例化。实例化的类在其__init__中有文件打开调用。我不想逐个修补,所以我决定修补整个类。但后来在该方法中,该类被强制转换为一个列表

例如:

class ClassUnderTest:

   def hard_to_test_method(self):
       something_to_do()
       a = ClassWithSideEffects()
       b = ClassWithSideEffects()
       something_else_to_do()
       return list(b)

我没有找到合适的文件来解决这样的案件


Tags: 文件to实例方法列表initdef单元测试
1条回答
网友
1楼 · 发布于 2024-09-30 16:41:29

经过长时间的谷歌搜索,我在这里找到了解决方案的提示:https://programmaticallyspeaking.com/mocking-__iter__-with-a-magic-mock-in-python.html

幸运的是,解决方案很短:

    @patch("class_with_side_effects.ClassWithSideEffects", return_value=MagicMock())
    def test_hard_to_test_method(self, mock_class):
        mock_class.return_value.__iter__.return_value = [1, 2, 3]
        c = ClassUnderTest()
        assert c.hard_to_test_method() == [1, 2, 3]

说明:

  • 当实例化模拟类时,将得到修补(模拟)类的返回值。因此,对象c是一个MagicMock实例
  • 在定义的第一行(mock_class.return_value.__iter__.return_value = [1, 2, 3]),我们设置了__iter__magic方法的返回值。当对对象调用len()时,这个神奇的方法会做出响应
  • 诀窍是@patch行。默认情况下,补丁程序返回一个Mock实例,但这次我们需要一个MagicMock实例,因为只有MagicMock会像我们预期的那样响应len()调用,因为它比普通的Mock类对这种情况有更合适的__iter__处理

相关问题 更多 >