0

我使用Python 2.6.6Python的補丁模擬似乎被調用,但斷言失敗

我想要做的就是使用模擬替換對象的創建,以確保正確的通話已完成。應該是直截了當的。

我的模塊:

import dir.SubModule 

class Cls(object): 
    def Start(self): 
     self.__obj = dir.SubModule.SubCls() 
     self.__obj.foo() 

我的測試:

import MyModule 
import unittest 
from mock import Mock, MagicMock, patch 

class MyTest(unittest.TestCase): 
    def setUp(self): 
     self.uut = MyModule.Cls() 

    def test_one(self): 
     with patch('dir.SubModule.SubCls', spec=True) as mockObj: 
      print "mock calls before" 
      print mockObj.mock_calls 
      self.uut.Start() 

      print "called: "  + str(mockObj.called) 
      print "foo called: " + str(mockObj.foo.called) 
      print "call_count: " + str(mockObj.call_count) 
      print "call_args: " + str(mockObj.call_args) 
      print "args_list: " + str(mockObj.call_args_list) 
      print "mock calls:\n" + str(mockObj.mock_calls) 
      print "method calls:\n " + str(mockObj.method_calls) 

輸出是:

mock calls before: 
[] 
called: True 
foo called: False 
call_count: 1 
call_args: call() 
args_list: [call()] 
mock calls: 
[call(), call().foo()] 
method calls: 
[] 

然而,測試失敗:

AssertionError: Expected call: foo() 
Not called 

我不明白這個模擬可以如何報告電話已經發出,但我不能斷言他們被呼叫。我錯過了什麼?

編輯: 加入所有指標的報告後,似乎有一些基本的東西我誤解了Python的嘲笑。如果foo()在調用列表中,那麼爲什麼調用只計算1,爲什麼foo.called報告爲「False」?

+0

你已經發布的代碼似乎並不符合你的代碼實際上跑得夠好,我們可以幫助你。它看起來像你發佈的代碼有一個完全不同的錯誤集。 – user2357112

+0

我發現的唯一錯誤是我在創建uut對象前丟失了setUp()聲明;否則它是我正在運行的代碼,除了我已經刪除了其他不必要的對象和變量的創建和使用(我已經證明,因爲它已在我的代碼中註釋掉了)。 – PfunnyGuy

回答

2

mockObj.foo在此測試中從未被調用過。 self.uut.Start()調用mockObj,創建一個新的模擬,然後調用即模擬的foo方法。如果你想要斷定此調用發生了,你將需要訪問正確的對象:

mockObj.return_value.foo.assert_called_with() 
+0

啊!我在另一篇文章中讀到了類似的東西。我需要找到並鏈接它,它有一個很好的解釋!謝謝! – PfunnyGuy

0

這裏是鏈接: link

我簡單的解決方法:

with patch('class') as mockCreator: 
    mockObj = mockCreator.return_value 

然後我可以毫不猶豫地使用'mockObj'。

我上週所連的解決方案跑了,當我第一次學習嘲弄 - 有點太早到挺沉的信息