我有两个模块。
a.py
def get_resource(arg1, arg2):
return Modelobject based on arg1 and arg2 or None
b.py(表格)
from a import get_resource
class A(forms.Form):
arg1 = forms.CharField()
arg2 = forms.CharField()
def clean(self):
res = get_resource(arg1, arg2)
if res is None:
validationerror
else:
cleaned_data.update(res_key=res)
现在我需要模拟get_resource部分,这样我就不需要任何数据库,但我无法让它工作。
这是我尝试的但它不起作用。我做错了什么?
class Test(TestCase):
def test_form_a(self):
with patch('b.get_resource') as mock_tool:
mock_tool.return_value = MagicMock(spec=MusicModel)
form_data = {'arg1': '1', 'arg2': 'Music'}
form = A(data=form_data)
我也尝试了带功能的side_effects
def my_side_effect(*args, **kwargs):
return value based on arg[0] and arg[1]
mock_tool.side_effect = my_side_effect
由于我在模拟和测试方面相当新手,有人能向我展示正确的方向吗?
答案 0 :(得分:0)
我不熟悉django表单,所以基本上我以适当的可测试方式修改了你的脚本。似乎测试都通过了,也许您在问题中省略了一些错误原因代码?但是,以下是一个工作示例供您参考。
%nosetests test.py test_no_patch_a(test.Test)......好的 test_patch_a(test.Test)...确定
a.py
def get_resource(arg1, arg2):
return arg1
b.py
from a import get_resource
class A(object):
arg1 = 'arg1'
arg2 = 'arg2'
res = None
def __init__(self, data):
self.res = get_resource(data['arg1'], data['arg2'])
def bow(self):
if self.res is None:
return 'validationerror'
else:
return self.res
test.py
import unittest
from mock import patch
from b import A
class Test(unittest.TestCase):
def test_patch_a(self):
with patch('b.get_resource') as mock_tool:
mock_tool.return_value = 'patched'
data = {'arg1': '1', 'arg2': 'Music'}
form = A(data=data)
self.assertEqual('patched', form.bow())
def test_no_patch_a(self):
data = {'arg1': '1', 'arg2': 'Music'}
form = A(data=data)
self.assertEqual('1', form.bow())
答案 1 :(得分:0)
更新:我想我发现了问题所在。虽然我很难理解为什么会发生这种情况,但这一切都取决于进口。显然,我需要在补丁中导入表单类,并在实例化表单后定义返回值:
class Test(TestCase):
def test_form_a(self):
with patch('b.get_resource') as mock_tool:
from b import A
form_data = {'arg1': '1', 'arg2': 'Music'}
form = A(data=form_data)
mock_tool.return_value = MagicMock(spec=MusicModel)
我猜这一切都归功于模块加载。