在Python2.7中用长链调用模拟静态函数调用

在Python2.7中用长链调用模拟静态函数调用,python,python-2.7,testing,mocking,Python,Python 2.7,Testing,Mocking,我正在尝试测试一个大型的遗留Django应用程序,我对Python模拟感到困惑,因为我从未在大型Python应用程序上工作过 具体来说,我有一个方法,它内部有一个长的调用链,可以生成一个数组: def update(self): # in some class X # ... for z in foo.models.Bar.objects.filter(x=1).select('xyz'): raise Exception("mocked successfully

我正在尝试测试一个大型的遗留Django应用程序,我对Python模拟感到困惑,因为我从未在大型Python应用程序上工作过

具体来说,我有一个方法,它内部有一个长的调用链,可以生成一个数组:

def update(self): # in some class X
    # ...
    for z in foo.models.Bar.objects.filter(x=1).select('xyz'):
        raise Exception("mocked successfully")
我想模拟foo.models.Bar.objects.filterx=1。选择“xyz”

尝试1

我尝试了从各种问题中收集到的几种方法,特别是使用装饰师:

@mock.patch('foo.models.Bar.objects.filter.select')
def test_update(self, mock_select):
    mock_select.return_value = [None]
    X().update()
然而,我从未触及模拟调用的内部-由于引发异常,测试应该失败

尝试2

尝试3

尝试4

然后我尝试了一些更基本的东西,看看我是否能得到一个NPE,这也不起作用

@mock.patch('foo.models.Bar')
def test_update(self, mock_Bar):
    mock_Bar.return_value = None
    X().update()
我所有的尝试都通过了测试,而不是像我预期的那样触发异常


时间不早了,所以我想我一定忽略了我所看到的示例中的一些基本内容

我可以让它通过模拟对象。尝试3已关闭,只需将其更改为filter.return\u value.select.return\u value即可通过。这是我的建议,似乎是在嘲笑。对象是首选的方式

@mock.patch('foo.models.Bar.objects')
def test_update(self, mock_bar_objects):
    mock_bar_objects.filter.return_value.select.return_value = [None]
    X().update()
编辑:测试运行输出:

ERROR: test_update (test_x.TestDjango)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/wholevinski/.virtualenvs/p2/lib/python2.7/site-packages/mock/mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "/home/wholevinski/so_test/django_mock/test/test_x.py", line 10, in test_update
    X().update()
  File "/home/wholevinski/so_test/django_mock/foo/x_module.py", line 6, in update
    raise Exception("mocked successfully")
Exception: mocked successfully

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)

你在X类中导入的条形图是什么样子的?你们有像这样进口的foo吗?导入foo就这样导入foo.clearification-我试图在示例代码中找到异常。至少在我运行它时,您的代码通过了测试,而不是遇到异常。添加了测试运行输出后,我看到了您预期的错误。
@mock.patch('foo.models.Bar.objects')
def test_update(self, mock_bar_objects):
    mock_bar_objects.filter.return_value.select.return_value = [None]
    X().update()
ERROR: test_update (test_x.TestDjango)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/wholevinski/.virtualenvs/p2/lib/python2.7/site-packages/mock/mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "/home/wholevinski/so_test/django_mock/test/test_x.py", line 10, in test_update
    X().update()
  File "/home/wholevinski/so_test/django_mock/foo/x_module.py", line 6, in update
    raise Exception("mocked successfully")
Exception: mocked successfully

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)