Python 如何模拟另一个.py使用的类及其方法

Python 如何模拟另一个.py使用的类及其方法,python,unit-testing,mocking,Python,Unit Testing,Mocking,我试图模拟另一个类使用的类及其方法 我的文件结构是: [1] my_animal.py包含Myclass和方法:do_bite() my_animal.py class Myclass(): def do_咬入(自身): 返回1 [2] my_module.py包含使用my_animal.py中的方法的jobMain(“”) my_module.py 导入系统 从我的动物进口我的班级 def jobMain(目录路径): 结果=Myclass() 如果result.do_bite()为无: 系

我试图模拟另一个类使用的类及其方法

我的文件结构是:

[1] my_animal.py包含
Myclass
和方法:
do_bite()

my_animal.py

class Myclass():
def do_咬入(自身):
返回1
[2] my_module.py包含使用my_animal.py中的方法的
jobMain(“”

my_module.py

导入系统 从我的动物进口我的班级 def jobMain(目录路径): 结果=Myclass() 如果result.do_bite()为无: 系统出口(1)#停在这里 [3] my_test.py包含要在
my_module.py

my_test.py

从my_动物导入Myclass
#试着模仿我的班级
@pytest.fixture
def mock_Myclass(monkeypatch):
“模拟myclass”
setattr(my_模块,“Myclass”,MagicMock())
#我尝试了下面的代码来模拟dobite()方法,但没有成功
#将Myclass.dobit模拟为“无”
@pytest.fixture
def mock_dobite(monkeypatch):
def模拟返回(*args,**kwargs):
将patch(“我的动物”,dobite)作为p:
实例=p.return\u值
instance.dobit=Mock(返回值=None)
setattr(my_module.Myclass,“do_bite”,mock_return)
#我的unittest测试dobit()方法
def测试数据(模拟数据类型,模拟数据类型):
使用pytest.raises(SystemExit)作为s_exit:
jobMain(“”)
断言s_exit.type==SystemExit
断言s_exit.value.code==1

我的问题是:如何将方法
do_bite()
的返回值模拟为
None
或任何其他预期值?

您的夹具过于复杂,下面是您可以使用的:

导入pytest
从unittest导入模拟
@pytest.fixture
def mock_dobite():
使用mock.patch('my_module.Myclass')作为模拟动物:
模拟动物。返回值。咬。返回值=无
产量
在导入类时对其进行修补(请参阅)。因为
Myclass
是这样导入的:

from my_animal import Myclass
您有一个对模块的本地引用,必须对其进行修补

mocked\u animal
是mocked类。要获取该类的实例,必须使用
mocked\u animal.return\u value
。通过添加
do\u bite.return\u value
,现在可以设置方法
do\u bite
的返回值

现在,您的测试将如下所示(请注意,您只需要一个fixture参数):

def测试(模拟测试):
使用pytest.raises(SystemExit)作为s_exit:
jobMain(“”)
断言s_exit.type==SystemExit
断言s_exit.value.code==1

您的夹具过于复杂,以下是您可以使用的:

导入pytest
从unittest导入模拟
@pytest.fixture
def mock_dobite():
使用mock.patch('my_module.Myclass')作为模拟动物:
模拟动物。返回值。咬。返回值=无
产量
在导入类时对其进行修补(请参阅)。因为
Myclass
是这样导入的:

from my_animal import Myclass
您有一个对模块的本地引用,必须对其进行修补

mocked\u animal
是mocked类。要获取该类的实例,必须使用
mocked\u animal.return\u value
。通过添加
do\u bite.return\u value
,现在可以设置方法
do\u bite
的返回值

现在,您的测试将如下所示(请注意,您只需要一个fixture参数):

def测试(模拟测试):
使用pytest.raises(SystemExit)作为s_exit:
jobMain(“”)
断言s_exit.type==SystemExit
断言s_exit.value.code==1

你在
monkeypatch.settatr()
中有一个打字错误。它说的是
dobite
而不是
do\u-bite
。是吗?是的,你是对的,这是我的打字错误。让我更正我的帖子。但问题是,我想知道是否有其他方法来模仿do\u-bite()?因为我尝试了很多方法,但都没有成功。你在
monkeypatch.settatr()
中有一个打字错误。它说的是
dobite
而不是
dou_-bite
。是吗?是的,你是对的,这是我的打字错误。让我更正我的帖子。但问题是,我想知道是否还有其他方法来模仿dou-bite()?因为我尝试了很多方法,但都没有成功很多感谢Bean Bremen先生!很多感谢Bean Bremen先生!我已经尝试过了,并且效果很好:)顺便说一句,“mock.patch”在我的pytest上不起作用,我需要删除前缀“mock”,所以对我来说它看起来是这样的:with patch('my_module.Myclass'))作为这个概念的模拟动物,我必须用2个模拟实现2个装置:1个用于类,1个用于方法本身(。然后在我的单元测试中输入它作为2个参数。但是应用你的方式,我现在只需要有1个装置,其中包括2个模拟:类和方法…非常感谢Breme先生:)我添加了导入来说明这一点-您可能使用了unittest.mock导入补丁中的
,这也没问题。很高兴我能提供帮助!很多感谢MrBean Bremen!很多感谢MrBean Bremen!我已经尝试过了,并且效果很好:)顺便说一句,“mock.patch”对我的pytest不起作用,我需要删除前缀“mock”,所以对我来说,它看起来是这样的:对于这个概念,补丁('my_module.Myclass')作为模拟动物,我必须用2个模拟实现2个装置:1个用于类,1个用于方法本身:(.然后在我的unittest中输入它作为两个参数。但是,按照你的方式,我现在只需要一个包含两个模拟的装置:类和方法…非常感谢Bean Bremen先生:)我添加了导入来说明这一点-你可能使用了unittest.mock导入补丁中的
,这也没问题。很高兴我能提供帮助!