2012-06-28 66 views
1

好的。我有運行此命令類:如何模擬單元測試的.mpg文件?

ffmpeg_command = "ffprobe -v quiet -print_format json -show_format -show_streams %s" % self.absolute_path 

哪裏self.absolute_path是一部電影的路徑,讓我們說.MPG文件。

我用於測試的文件大小是4GB,我不想在我的GIT回購庫中提交它。

所以我就在想嘲笑這個文件,並創建一個名爲文件:

mock.mpg 

當作爲輸入提供給ffprobe命令,它會返回相同的字符串作爲實際MPG影片。那可能嗎?

或者我應該選擇其他方法?

這是我的課:

class Movie(object): 

     absolute_path = None 
     info = None 

     def __init__(self, path): 
      self.absolute_path = "%s/%s" % (os.getcwd(), path) 
      if(os.path.exists(self.absolute_path) is False): 
       raise IOError("File does not exist") 

      self.info = json.loads(self.get_info()) 

    def get_info(self): 
      ffmpeg_command = "ffprobe -v quiet -print_format json -show_format -show_streams %s" % self.absolute_path 
      return subprocess.check_output(ffmpeg_command, shell=True) 

這是我怎麼會是單元測試它:

class MovieTest(unittest.TestCase): 

     def test_foo(self): 
      movie = Movie("tests/test_1.mpg") # this file should be a mock file!!! 

回答

3

我建議你包裝ffmpeg依賴

爲此提供一個模擬。無論如何,包裝外部工具/庫是一個好主意。 如果有任何接口發生變化,則只需修復包裝器,而不是從代碼到ffmpeg的所有連接。包裝只需要薄紙以便於單元測試。

1

信託的ffmpeg做的工作正常。然後,您在測試中必須做的是驗證該命令對於給定的輸入是否正確。

+0

但我希望能夠測試我的邏輯,這將取決於mpg文件的ffprobe輸出(以測試我的方法get_duration返回正確的浮點數等),所以我需要以某種方式模擬它。如果沒有測試目錄中的實際mpg文件,我無法確定如何做到這一點。 –

+0

@RichardKnop簡單地模仿ffpeg依賴,如果需要的話創建一​​個包裝類。然後在你的測試中驗證圍繞輸入和輸出的預期行爲。 –

+0

@ RichO'Kelly是的 - 你需要能夠提供一個ffmpeg的模擬版本,這樣你實際上不需要有一個avi文件來測試你的代碼。 @RichardKnop我爲節點使用'mock'庫。它似乎工作得很好。 – lenswipe