2016-09-25 310 views
1

一類的所有方法我已成立了一個單元測試,看來看去像電話:如何忽視或忽略爲測試

from unittest import TestCase 
from . import main 
from PIL import Image 
class TestTableScreenBased(TestCase): 
def test_get_game_number_on_screen2(self): 
     t = main.TableScreenBased() 
     t.entireScreenPIL = Image.open('tests/1773793_PreFlop_0.png') 
     t.get_dealer_position() 

,我想測試被稱爲get_dealer_position功能。在這個功能我更新我的GUI中的某些項目未初始化的測試,所以我得到預期的錯誤:NameError: name 'ui_action_and_signals' is not defined

def get_dealer_position(self): 
    func_dict = self.coo[inspect.stack()[0][3]][self.tbl] 
    ui_action_and_signals.signal_progressbar_increase.emit(5) 
    ui_action_and_signals.signal_status.emit("Analyse dealer position") 
    pil_image = self.crop_image(self.entireScreenPIL, self.tlc[0] + 0, self.tlc[1] + 0, 
           self.tlc[0] +800, self.tlc[1] + 500) 

什麼是「忽略」或覆蓋的方法的所有調用的最佳方式在那個班ui_action_and_signals?這個類包含了很多方法(對於數百個gui項目),我不希望分別重寫每一個。有沒有辦法告訴python測試應該忽略與ui_action_and_signals相關的所有內容?是否有任何優雅的方式與猴子修補或嘲笑將使用應用程序在此?

回答

2

如果您使用Python> = 3.3,則可以使用內置的unittest.mock模塊。如果您使用的是較早版本的Python,則可以使用Pip安裝the backport來使用相同的工具。

您將需要一個模擬對象,以取代丟失的依賴 - 有很多方法可以做到這一點,但一個方法是使用補丁裝飾這需要在測試之後刪除模擬對象的護理:

from unittest.mock import patch 
from unittest import TestCase 
from . import main 
from PIL import Image 
class TestTableScreenBased(TestCase): 
    @patch('module.path.of.ui_action_and_signals') 
    def test_get_game_number_on_screen2(self, mock_ui_action_and_signals): 
     t = main.TableScreenBased() 
     t.entireScreenPIL = Image.open('tests/1773793_PreFlop_0.png') 
     t.get_dealer_position() 

有關於修補程序修飾符in the official documentation的更多信息,包括一些hints on where to patch,有時不完全明顯。

模擬系統還有許多其他功能,您可能想要使用它們,例如複製現有類的規格,或查找在測試過程中對您的Mock對象進行的調用。