pup*_*eno 2 python testing mocking
我正在为一段使用zeep访问SOAP API的代码编写单元测试,所以我想模拟出来.在我的实际代码中,它看起来像这样:
from zeep import Client
def do_something():
client = Client("...")
Run Code Online (Sandbox Code Playgroud)
在我的测试中,我这样做:
from unittest import mock
@mock.patch('zeep.Client')
def test_do_somethi(self, MockedClient):
do_something()
Run Code Online (Sandbox Code Playgroud)
在Client实际功能是获得,是实际ZEEP客户端,而不是我的嘲笑.我也尝试过:
@mock.patch('zeep.client.Client')
Run Code Online (Sandbox Code Playgroud)
结果是一样的.
我也尝试过:
def test_do_something(self):
with mock.patch('zeep.client.Client') as MockedClient:
do_something()
Run Code Online (Sandbox Code Playgroud)
没有区别.
任何想法为什么这不起作用?
当mock不起作用时,首先要查找的是修补正确的名称.
如果你想模拟,zeep但你导入像
from zeep import Client
Run Code Online (Sandbox Code Playgroud)
并且你的测试在同一个文件中,你Client没有补丁zeep.Client.相反,如果您导入它
import zeep
Run Code Online (Sandbox Code Playgroud)
然后zeep.Client在SUT代码中使用,然后你修补zeep.Client.
如果您正在测试位于其他模块中的代码(例如mymodule),那么您可以zeep在其中导入
from zeep import Client # (1)
Run Code Online (Sandbox Code Playgroud)
然后在你的测试模块中
import mymodule
Run Code Online (Sandbox Code Playgroud)
那么你补丁mymodule.Client,......或者mymodule.zeep.Client如果你import zeep在(1)中使用了替代形式.