在Python中使用mock.patch

时间:2013-07-18 09:33:32

标签: python mocking

如何修补foo()使用的变量以及从其他文件导入的变量?

test file:
from f import foo

def test():
  foo()


f file:
from f2 import some_var

def foo():
  print some_var

即使some_var文件中的f为10,我也可能希望它从foo()调用test()时有另一个值。如何使用mock.patch.object实现这一目标?

2 个答案:

答案 0 :(得分:0)

不亲自尝试:

#test file
import f2
import mock

def test():
    with mock.patch('f2.some_var', 'your-new-value-for-somevar'):
        # your test code

当您在“f文件”中使用some_var导入from f2 import some_var时,您需要确保在from f2 import some_var运行时修补程序就位。我只是在“f file”中使用import f2,并将some_var称为f2.some_var

--- ---编辑 Gah,你当然可以在你的测试课中做到这一点:

#test file
import f
import mock

def test():
    with mock.patch('f.some_var', 'your-new-value-for-somevar'):

这会修补some_var f已被from f2 import some_var复制的值{{1}}

答案 1 :(得分:0)

在您给出的情况下,您不一定需要patch.object来修改值。你可以这样做:

test.py:

from f import foo
import f

f.some_var = 'test-val'

def test():
  foo()

Foo会在你给出的情况下打印出'test-val'。

如果您有一个需要模拟的函数,除了Steve的例子之外,您还可以使用patch.object作为装饰器。

test.py

from mock import patch
from f import foo  
import f    

@patch.object(f, 'some_fn')               
def test(some_fn_mock):     
    some_fn_mock.return_value = 'new-stuff'    
    f.foo() 


test()

f.py

from f2 import some_fn
def foo():              
    print some_fn()

f2.py

def some_fn():         
    print 'stuff'