2017-06-05 79 views
0

我很難用包裝模擬我的頭來使用Mock在Python中進行非平凡的單元測試。我不想爲我的測試套件使用生產數據庫,並且想要創建僅測試數據庫。Python模擬單元測試聲明Mysql結果集

比方說,我想與包含此數據這三個表創建一個模擬數據庫:

FRUIT 
id  Name 
1  Apple 
2  Pear 
3  Orange 

COLOR 
id  Name 
1  Red 
2  Yellow 
3  Orange 

FRUIT_COLOR 
id  fruit_id color_id 
1  1   1 
2  1   2 
3  2   2 
4  3   3 

現在讓我們假設我有以下功能:

def assess_fruit(self): 
    query = """ 
     SELECT 
     f.name AS FRUIT, 
     c.name AS COLOR 
     FROM fruit_color AS fc 
     JOIN fruit AS f ON f.id = fc.fruit_id 
     JOIN color AS c ON c.id = fc.color_id 
     WHERE color.name = 'Red'; 
    """ 
    cursor.execute(self._query) 
    results = cursor.fetchall() 
    return results 

如何獲得有關使用模擬這個數據庫並測試結果應該是這樣的元組列表?

[(Apple, Red), (Apple, Yellow)] 

在此先感謝您。

回答

1

Python單元測試TestCase類有2個方法setUptearDown當您的測試用例開始和結束時調用它。您可以將代碼CREATE的表格和INSERT數據添加到這兩種方法的表格中。見下面的例子:

from unittest import TestCase 


class TestMyData(TestCase): 

    def setUp(self): 
     query = """ 
     CREATE TABLE FRUIT (
      id INT, 
      Name VARCHAR(255) 
     ); 
     INSERT INTO FRUIT (id, Name) 
     VALUES (1, 'Apple'), 
       (2, 'Pear'), 
       (3, 'Orange'); 
     """ 
     cursor.execute(query) 

     # Add CREATE & INSERT table statements for COLOR and FRUIT_COLOR tables 

    def assess_fruit(self): 
     query = """ 
      SELECT 
      f.name AS FRUIT, 
      c.name AS COLOR 
      FROM fruit_color AS fc 
      JOIN fruit AS f ON f.id = fc.fruit_id 
      JOIN color AS c ON c.id = fc.color_id 
      WHERE color.name = 'Red'; 
     """ 
     cursor.execute(query) 
     results = cursor.fetchall() 
     return results 

    def tearDown(self): 
     query = """ 
     DROP TABLE FRUIT; 
     DROP TABLE COLOR; 
     DROP TABLE FRUIT_COLOR; 
     """ 
     cursor.execute(query) 

如果您想了解如何實際嘲笑你調用數據庫,那麼你可以在this blog post看看我寫的不是很久以前。

+0

以這種方式寫入的數據是否保存到磁盤?有沒有辦法使用Mock庫(或任何其他方法)將數據庫完全保存在setUp和tearDown函數之間的內存中? – OnlyDean

+0

是的。這將寫入您的模擬數據庫,聲稱在您的問題中創建。 –

+0

太棒了,謝謝,很高興知道。我很難知道如何提出正確的問題。我目前沒有硬盤上的測試數據庫,我需要創建_something_。如果有辦法在記憶中完成這一切,那將是最佳的。如果沒有,你發佈的答案是一個很好的起點。謝謝。 – OnlyDean