2015-12-20 46 views
2

這用於使用python模擬版本1.0.1,但在升級到模擬版本1.3.0後開始失敗。我在Mac OS X Yosemite 10.10.5上運行Python 2.7.10版本。python-mock:缺少默認值的'self'參數

我減小邏輯從現有生產測試以下僞測試再現的問題:

import unittest 

import mock 
from mock import Mock, patch 

class Outer(object): 
    class MyClass(object): 

     def doStuff(self, action): 
      pass 

@patch.object(Outer, "MyClass", autospec=True, 
       return_value=Mock(spec_set=Outer.MyClass, 
           doStuff=Mock(spec_set=Outer.MyClass.doStuff))) 
class MyTestCase(unittest.TestCase): 
    def testDoStuff(self, myClassMock): 
     obj = myClassMock() 
     obj.doStuff(action="swim") 
     obj.doStuff.assert_called_once_with(action="swim") 

故障輸出看起來像這樣:

$ py.test -v new_mock_test.py 
====================================================================================== test session starts ======================================================================================= 
platform darwin -- Python 2.7.10, pytest-2.8.5, py-1.4.30, pluggy-0.3.1 -- /System/Library/Frameworks/Python.framework/Versions/2.7/Resources/Python.app/Contents/MacOS/Python 
cachedir: .cache 
rootdir: /Users/me/TempOnDesktop, inifile: 
plugins: cov-1.6, xdist-1.8 
collected 1 items 

new_mock_test.py::MyTestCase::testDoStuff FAILED 

============================================================================================ FAILURES ============================================================================================ 
_____________________________________________________________________________________ MyTestCase.testDoStuff _____________________________________________________________________________________ 

self = <new_mock_test.MyTestCase testMethod=testDoStuff>, myClassMock = <MagicMock name='MyClass' spec='MyClass' id='4367040848'> 

    def testDoStuff(self, myClassMock): 

     obj = myClassMock() 

     obj.doStuff(action="swim") 

>  obj.doStuff.assert_called_once_with(action="swim") 

new_mock_test.py:26: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
../Library/Python/2.7/lib/python/site-packages/mock/mock.py:948: in assert_called_once_with 
    return self.assert_called_with(*args, **kwargs) 
../Library/Python/2.7/lib/python/site-packages/mock/mock.py:937: in assert_called_with 
    six.raise_from(AssertionError(_error_message(cause)), cause) 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

value = AssertionError("Expected call: doStuff(action='swim')\nActual call: doStuff(action='swim')\n'self' parameter lacking default value",) 
from_value = TypeError("'self' parameter lacking default value",) 

    def raise_from(value, from_value): 
>  raise value 
E  AssertionError: Expected call: doStuff(action='swim') 
E  Actual call: doStuff(action='swim') 
E  'self' parameter lacking default value 

../Library/Python/2.7/lib/python/site-packages/six.py:718: AssertionError 
========================================================================== 1 failed, 2 pytest-warnings in 0.13 seconds =========================================================================== 
+0

請格式化您的問題 – manetsus

回答

2

Ommit spec_set(和spec)在實例方法模擬Outer.MyClass.doStuffself將不會被assert_called_once_with捕獲/聲明,並且您的測試將通過。

@patch.object(Outer, "MyClass", autospec=True, 
      return_value=Mock(spec_set=Outer.MyClass, 
          doStuff=Mock()))