2017-02-14 61 views
4

我試圖學習Python和嘲諷基礎設施的Python在同一時間(由於要求在我的工作地點)。我還應該提及,我對C++或任何其他語言的嘲笑功能也不熟悉。newbiee查詢:蟒蛇嘲弄

到目前爲止,從我所瞭解的是,通過嘲笑,我可以鍛鍊使操作系統的應用程序代碼。網絡等相關的調用,而沒有實際調用這些操作。

比方說,我的應用程序,實現爲network.py

#!/usr/bin/env python 

import sys 
import socket 

class NetworkService(object): 
    def sock_create(self): 
     try: 
      s = socket.socket() 
      s.close() 
      print "closed socket" 
     except Exception, err:  
      print "error creating socket" 
      sys.exit(1) 

的事情,我想實現我的單元測試是:

  1. 確保兩個正常和失敗路徑經過測試。

在這種情況下,要實現,這個我想拿出與行使sock_create方法,如下樣本單元測試用例:

#!/usr/bin/env python 

import unittest 
import mock 
from network import NetworkService 

class NetworkServiceTest(unittest.TestCase): 
    @mock.patch('network.socket') 
    def test_01_sock_create(self, mock_sock): 
     reference = NetworkService() 
     mock_sock.return_value = False 
     # NetworkService::sock_create::s.close() should NOT get called 
     reference.sock_create() 
     self.assertFalse(mock_sock.close.called, "Failed to not call close") 

     mock_sock.socket.return_value = True 
     # NetworkService::sock_create::s.close() should get called 
     reference.sock_create() 
     # how to test this ??? 
     #mock_sock.close.assert_called_with("") 

if __name__ == '__main__': 
    unittest.main() 

正如你可以在上面看到,該最後'斷言'聲明目前已被註釋掉;我不確定,如何檢查?下面給我的錯誤:

#!/usr/bin/env python 

import unittest 
import mock 
from network import NetworkService 

class NetworkServiceTest(unittest.TestCase): 
    @mock.patch('network.socket') 
    def test_01_sock_create(self, mock_sock): 
     reference = NetworkService() 
     mock_sock.return_value = False 
     reference.sock_create() 
     self.assertFalse(mock_sock.close.called, "Failed to not call close") 

     mock_sock.socket.return_value = True 
     reference.sock_create() 
     self.assertTrue(mock_sock.close.called, "Should have called s.close") 

if __name__ == '__main__': 
    unittest.main() 

和錯誤:

$ python tester.py 
F 
====================================================================== 
FAIL: test_01_sock_create (__main__.NetworkServiceTest) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/site-packages/mock/mock.py", line 1305, in patched 
    return func(*args, **keywargs) 
    File "tester.py", line 17, in test_01_sock_create 
    self.assertTrue(mock_sock.close.called, "Should have called s.close") 
AssertionError: Should have called s.close 

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

FAILED (failures=1) 
closed socket 
error creating socket 

注意,我使用的Python 2.7嘲諷(模擬需要安裝一個單獨的模塊)

+0

你檢查了這個:https://medium.com/@echohack/python-unit-testing-injecting-exceptions-with-mock-and-nose-e46bf579c867#.gnrot0dlu –

回答

1

network.py中打印出一個字符串。如果你反而會打印出實際的錯誤,你會看到失敗的原因。在這種情況下你會看到它由於AttributeError而失敗。 AttributeError("'bool' object has no attribute 'close'",)

發生這種情況的原因是因爲您要給模擬對象返回值TrueFalse。由於布爾沒有任何打開或關閉的方法,它會拋出該錯誤。

其他一些提示。您正在使用Exception,它會捕獲所有異常。相反,只能捕獲您知道會發生的異常。找出套接字可能拋出的異常。

這樣你就可以早些發現它。

+0

「mock_sock.return_value = None」工作,並且還將正面測試更改爲「self.assertRegexpMatches(reference.sock_create(),」closed socket「,msg =」未能調用關閉「)」工作。 – Amit

+0

@amit,你應該在單元測試中做什麼,儘管它與實際代碼中發生的行爲相匹配。在創建它時,套接字在什麼情況下會失敗? – Jonathan