
您必须使用
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="aanbb")def test_interface_mapping_new(self, mo): handlers = (mo.return_value,mock_open(read_data="AAnBB").return_value,) mo.side_effect = handlers with open("ppp") as f: self.assertEqual("aanbb",f.read()) with open("ppp") as f: self.assertEqual("AAnBB",f.read())从python 3.4开始,您还可以使用readline(),readlines()而不模拟其他任何东西。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)