我有一个实际连接到服务并执行身份验证和其他操作的类,但所有这些都在我的代码中的其他地方进行了很好的测试,我只想在以下测试中进行模拟:
带有繁琐 __init__ 的对象
class B(object):
def __init__(self, username, password):
con = connect_to_service() #
auth = con.authenticate(username, password)
def upload(self)
return "Uploaded"
class A(object):
def send():
b = B('user', 'pass')
b.upload()
测试.py
# Now, I want here to test A, and since it uses B, I need to mock it, but I can't get it to work.
def test_A():
# Here I need to mock B and B.upload, I tried this:
a = A()
b = Mock()
b.upload.return_value='Hi'
a.send()
但是这个测试失败了,因为它到达了 B.init 上的 auth(),我想将其作为 Mock 模型。
最佳答案
我认为这是 mock.patch
的典型用例。注意 patch
装饰器需要主模块变为 __main__
from mock import patch, Mock
from abmodule import A, B #Where A and B are
@patch("abmodule.B")
def test_A(bmock):
# Set B costructor to return a Mock object
bmock.return_value = Mock()
bmock.upload.return_value='Hi'
a = A()
a.send()
#Check if upload was called!
bmock.return_value.upload.assert_called_with()
之后,您可以在代码的另一部分再次使用原始的 B
:修补后的版本就在函数的范围内。
关于python - 用乏味的 __init__ 模拟一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26374539/