2015-09-19 59 views
0

我是python單元測試框架的新手,在模擬依賴關係時遇到了很多混亂。如何在python中模擬依賴關係

我想要編寫單元測試下面一類的成員函數,(check_something()):

class Validations:  
    def check_something(self): 
     abc = os.environ['PLATFORM'] 
     xyz = Node() 
     no_of_nodes = len(xyz.some_type_var) 
     if abc != "X_PLATFORM" or no_of_nodes != 1: 
      raise someException() 

我們如何消除依賴?

  1. 需要模擬Node()
  2. 我們如何確保abc被分配X_PLATFORM
  3. 如何將值1分配給變量no_of_nodes?而後者又來自Node()對象。

    class Node(object): 
        def __init__(self): 
         self.nodes = DEF() 
         self.some_type_var = someclass().getType() 
         self.localnode = os.environ['HOSTNAME'] 
         self.peertype = self.get_peer_type() 
    
        def get_peer_type(self): 
         return node 
    

我試圖寫下面的單元測試。我無法檢查失敗並通過條件。我不確定這是否正確。

class TestValidation(unittest.TestCase): 

    @mock.patch.object(Node, "get_peer_type") 
    @mock.patch('somefile.Node', spec=True) 
    def test_1(self, mock_object1, mock_object2): 
     os.environ['PLATFORM'] = 'X_PLATFORM' 
     obj = Validations() 
     self.assertRaises(someException, obj.check_something) 

驗證類使用Node()類對象和節點類使用一些其他類。

  1. 如何確保異常是否被引發取決於條件?

回答

2

是的,你會嘲笑任何測試代碼單元外部的東西。這意味着os.environ字典和Node()類。

該修補程序需要應用於您的代碼所在的模塊;如果somefileValidations的模塊相同,則爲@mock.patch('somefile.Node', spec=True);至於爲什麼,請參閱Where to patch section

我不確定在這裏使用spec=True是否有幫助;您的Node屬性是在Node.__init__中創建的所有實例屬性,因此它們在上不可用,這是通知規範的原因。如果你真的想要設定一個規格,請參閱autospeccing關於如何克服的部分。

abc設置爲os.environ,您可以使用patch.dict() object來修補該字典以滿足您的需求。

xyz = len(xyz.some_type_var)該簡單地通過任一some_type_var屬性與右長度,設置爲一個對象處理的通過設置xyz.some_type_var.__len__.return_value,因爲它是xyz.some_type_var.__len__()方法被稱爲用於len()功能。

所以,測試,你會怎麼做:

class TestValidation(unittest.TestCase): 
    @mock.patch('somefile.Node') 
    def test_1(self, mock_node): 
     # set up the Node() instance, with the correct length 
     node_instance = mock_node.return_value 
     node_instance.some_type_var.__len__ = 2 
     # or, alternatively, node_instance.some_type_var = (1, 2) 

     # set up os.environ['PLATFORM'] 
     with mock.patch.dict('os.environ', PLATFORM='X_PLATFORM'): 
      obj = Validations() 
      with self.assertRaises(someException): 
       obj.check_something()