为什么要嘲笑zeep.Client不工作?

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)

没有区别.

任何想法为什么这不起作用?

pro*_*ico 5

当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)中使用了替代形式.