我已经从一个模块中导入了一个类,但是当我尝试修补类名而不使用它的模块作为前缀时,我得到一个类型错误:
TypeError: Need a valid target to patch. You supplied: 'MyClass'
例如,下面的代码给了我上面的错误:
import unittest
from mock import Mock, MagicMock, patch
from notification.models import Channel, addChannelWithName, deleteChannelWithName, listAllChannelNames
class TestChannel(unittest.TestCase):
@patch("Channel")
def testAddChannelWithNamePutsChannel(self, *args):
addChannelWithName("channel1")
Channel.put.assert_called_with()
虽然代码的第二个版本没有给我类型错误:
import unittest
from mock import Mock, MagicMock, patch
from notification.models import Channel, addChannelWithName, deleteChannelWithName, listAllChannelNames
class TestChannel(unittest.TestCase):
@patch("notification.models.Channel")
def testAddChannelWithNamePutsChannel(self, *args):
addChannelWithName("channel1")
Channel.put.assert_called_with()
这是为什么?为什么我可以在其他地方将 Channel 引用为“Channel”,而对于补丁我需要模块前缀才不会出错?另外,我有一种感觉,给出完整的模块前缀也不起作用,因为当我调用 Channel.put.assert_call_with() 时,我得到一个错误,即 assert_call_with 不是 Channel.put 的属性。有人可以解释发生了什么吗?非常感谢!