Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 模拟以django形式调用的函数_Python_Django_Unit Testing_Mocking - Fatal编程技术网

Python 模拟以django形式调用的函数

Python 模拟以django形式调用的函数,python,django,unit-testing,mocking,Python,Django,Unit Testing,Mocking,我有两个模块 a、 派克 b、 py(表格) 现在我需要模拟get_资源部分,这样我就不需要任何数据库,但我无法让它工作 这是我试过的,但没用。我做错了什么 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 = {

我有两个模块

a、 派克

b、 py(表格)

现在我需要模拟get_资源部分,这样我就不需要任何数据库,但我无法让它工作

这是我试过的,但没用。我做错了什么

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)
我还尝试了一个函数的副作用

def my_side_effect(*args, **kwargs):
  return value based on arg[0] and arg[1]

mock_tool.side_effect = my_side_effect

因为我在模拟和测试方面是个新手,有人能告诉我正确的方向吗?

我不熟悉django表单,所以基本上我以一种合适的可测试方式修改了您的脚本。似乎所有的测试都通过了,也许你忽略了一些问题中的错误代码?但是,以下是一个工作示例,供您参考

%鼻测试 测试\u无\u补丁\u a(测试。测试)。。。好啊 测试补丁(test.test)。。。嗯

a、 派克

b、 派克

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())

更新:我想我发现了问题所在。虽然我很难理解为什么会发生这种情况,但这完全取决于进口。显然,我需要在补丁中导入表单类,并在实例化表单后定义返回值,以便:

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)

我想这都是由于模块加载。

为什么特别要模拟它,这样就不需要数据库了?我意识到在“纯”单元测试中会出现这种情况,但Django的单元测试环境包括准确地设置测试数据库,这样您就不必担心这种事情。好吧,我只是开始测试和其他东西。由于我只想检查表单的clean方法的重写,我想看看是否可以在不接触数据库的情况下完成它。我想,若我接触数据库并创建装置,那个么所有这些都不会是unittest。
def get_resource(arg1, arg2):
 return arg1
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
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())
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)