模拟内置'开放"在contextlib中使用时的函数

时间:2014-08-28 17:58:21

标签: python unit-testing mocking

我知道之前已经问过这个问题,但我有一个特别的问题,这意味着我希望mock_open实际返回一个特定的模拟对象。

我有一个我想测试的功能:

def foo(src,dest):
    with contextlib.nested(
         open(src,'r'),
         open(dest,'w')) as (src,dest):
         d = src.read(1)
         ....

我的问题是,使用mock_open(),如何让它返回特定的src和dest模拟,所以我可以对它们进行断言?即使我使用mock_open(mock = mock_src),它仍然不会传递我想要的对象,而是一个新对象。

1 个答案:

答案 0 :(得分:1)

你想要的是被模拟的open为这两个调用返回一个不同的模拟对象:你可以使用side_effect来获取那个行为,但你需要一个小技巧来创建有效的模拟文件处理程序< / p>

m = msrc = mock_open() #That create a handle for the first file
mdst = mock_open() #That create a handle for the second file
m.side_effect=[msrc.return_value,mdst.return_value] # Mix the two handles in one of mock the we will use to patch open
with patch("builtins.open", m):
    with open("src",'r') as src , open("dest",'w') as dest:
        print(src)   #Two different mock file!
        print(dest)

我为python 3编写了代码,但应该简单地将其翻译为较旧的python(我注意到你使用嵌套)。

我已经回答了一个非常类似的问题,但解决方案要好得多!仅供记录Python mock builtin 'open' in a class using two different files