gpt4 book ai didi

python - 在类方法中模拟函数

转载 作者:太空狗 更新时间:2023-10-30 00:02:34 27 4
gpt4 key购买 nike

我想模拟一个在 Django 项目中测试类方法时在类方法中调用的函数。考虑以下结构:

应用程序/utils.py

def func():
...
return resp # outcome is a HTTPResponse object

应用程序/模型.py

from app.utils import func

class MyModel(models.Model):

# fields

def call_func(self):
...
func()
...

app/tests/test_my_model.py

from django.test import TestCase
import mock

from app.models import MyModel

class MyModelTestCase(TestCase):

fixtures = ['my_model_fixtures.json']

def setUp(self):
my_model = MyModel.objects.get(id=1)

@mock.patch('app.utils.func')
def fake_func(self):
return mock.MagicMock(headers={'content-type': 'text/html'},
status_code=2000,
content="Fake 200 Response"))

def test_my_model(self):
my_model.call_func()
... # and asserting the parameters returned by func

当我运行测试时,模拟函数 fake_func() 被避免,而真正的 func() 被调用。我想 mock.patch 装饰器中的范围可能是错误的,但我找不到让它工作的方法。我该怎么办?

最佳答案

您的代码存在三个问题:

1) 正如 Daniel Roseman 提到的,您需要修补调用函数的模块,而不是定义它的地方

2) 此外,您需要修饰实际将执行调用模拟函数的代码的测试方法。

3) 最后,您还需要将模拟版本作为参数传递给您的测试方法,可能是这样的:

fake_response = mock.MagicMock(headers={'content-type': 'text/html'},
status_code=2000,
content="Fake 200 Response"))


class MyModelTestCase(TestCase):

fixtures = ['my_model_fixtures.json']

def setUp(self):
my_model = MyModel.objects.get(id=1)

@mock.patch('app.models.func', return_value=fake_response)
def test_my_model(self, fake_response): # the mock goes in as a param or else you get number of arguments error!
my_model.call_func()
self.assertTrue(fake_response.called)

关于python - 在类方法中模拟函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29458327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com