您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用两个不同的文件在类中的Python模拟内置“打开”

使用两个不同的文件在类中的Python模拟内置“打开”

您必须使用side_effect修补open对象(mock_open)的属性,并且不要忘记设置return_valuefor__exit__方法

@patch('__builtin__.open', spec=open)
def test_interface_mapping(self, mock_open):
    handle1 = MagicMock()
    handle1.__enter__.return_value.__iter__.return_value = ('aa', 'bb')
    handle1.__exit__.return_value=False
    handle2 = MagicMock()
    handle2.__enter__.return_value.__iter__.return_value = ('AA', 'BB')
    handle2.__exit__.return_value=False
    mock_open.side_effect = (handle1, handle2)
    with open("ppp") as f:
        self.assertListEqual(["aa","bb"],[x for x in f])
    with open("ppp") as f:
        self.assertListEqual(["AA","BB"],[x for x in f])

当在contextlib中使用时, 我发现一种更为优雅的方法来[模拟内置的“打开”功能

所以你可以重写测试像

@patch('__builtin__.open', new_callable=mock_open, read_data="aa\nbb")
def test_interface_mapping_new(self, mo):
    handlers = (mo.return_value,mock_open(read_data="AA\nBB").return_value,)
    mo.side_effect = handlers
    with open("ppp") as f:
        self.assertEqual("aa\nbb",f.read())
    with open("ppp") as f:
        self.assertEqual("AA\nBB",f.read())

从python 3.4开始,您还可以使用readline(),readlines()而不模拟其他任何东西。

python 2022/1/1 18:28:55 有365人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶