2012-10-16 130 views
1

我繼承寫入新的「/etc/udev/rules.d中」映射文件,然後一些Python代碼,使子進程調用的udev有它刷新其設備列表:單元測試蟒蛇的udev互動

call(['/sbin/udevadm', 'trigger', '--action=change']) 

觸發器調用是必要的,因爲我們需要更新映射而不想拔出並插回被映射的設備。我的問題是「呼叫」線在某一點被刪除,在程序的其他部分造成非明顯的副作用,因此未被捕獲。

我通常的解決方法是對這個方法(寫映射文件並調用觸發器)進行單元測試以強制執行預期的行爲,但是這種行爲似乎超出了單元測試的範圍。這是一個系統調用,更不用說udevadm觸發器需要sudo訪問。我無法弄清楚在這種情況下如何/嘲笑什麼。

我考慮過使用pyudev庫,因爲我發現它可以模擬udev的某些行爲,但它看起來並不像它可以嘲諷觸發器行爲(甚至無法訪問它)。

缺少一個很大的「#DO DELETE THIS LINE EVER!」在「通話」線路之上,有什麼我可以在這裏做的,以防止將來被刪除?從現在開始一年後,「不要刪除」的行很容易被忽略,當時沒有人知道它爲什麼在那裏。

回答

1

這是我決定在這種情況下做的,如果有人不同意我的答案,請加上!

這是一個兩個參與者。

首先,我打包了我所關心的電話,並在我的代碼中將直接「呼叫」切換爲此。

class UdevWrapper: 
    def udevadm_trigger(self): 
     call(['/sbin/udevadm', 'trigger', '--action=change']) 

(類包含不止這些,這裏只是爲了清楚而簡化)

接下來,我嘲笑了包裝方法和測試,以確保它被稱爲

@patch.object(utils.UdevWrapper,'udevadm_trigger') 
def test_trigger_called(self,mock_udevadm_trigger): 
    mock_udevadm_trigger.return_value = True 

    # name changed for clarity 
    ClassWhereTriggerCalled.func() 
    assert mock_udevadm_trigger.called 

做這本方式是通過閱讀約Behaviour Driven Development的啓發。 BDD的全部想法對我來說都是全新的,所以我不確定BDD支持者如何看待我的解決方案的風格/功能,但它確實符合我的要求 - 如果刪除了這行代碼,顯然會中斷(我的測試)未來。

我打算將它切換到未來使用 monkeypatch,以便我可以創建一個可以檢查狀態(存儲觸發器的順序也很重要)的存根函數。不過原理都是一樣的:

  1. 裹在可以嘲笑
  2. 寫測試,以確保正確的功能特性
  3. 素裹法的方法