簡體   English   中英

有沒有一種方法可以使用模擬()(或類似方法)模擬我從單元測試“調用”的腳本的日期和時間?

[英]Is there a way I can use mock() (or similar) to mock the date & time for a script I *invoke* from a unit test?

我已經在Python中使用unittest編寫了一些單元測試。 但是,它們不是簡單地以常規方式測試對象,而是通過使用Popen調用另一個Python腳本來調用該腳本。 這是設計使然-這是一個命令行實用程序,因此我想像用戶一樣對其進行測試,其中包括諸如命令行選項等內容。 為了清楚起見,單元測試和要測試的腳本都是用Python(准確地說是v3)編寫的。

我正在測試的腳本大量使用了datetime.now() ,並且理想情況下,我想以某種方式模擬該值,以便保持其不變。 我見過這樣做,雖然的所有實例(如這一個使用模擬)承擔某種形式的白盒測試。

我有辦法嗎?

如果不使用Popen沒有什么可以阻止您測試CLI的。 您只需要構建代碼以使其成為可能:

而不是這樣:

if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser()
    # ... Add args
    ns = parser.parse_args()

做這個:

import argparse

def main(argv):
    parser = argparse.ArgumentParser()
    # ... Add args
    parser.parse_args(argv[1:])  # This is the default for argparse
    ns = parser.parse_args()

if __name__ == "__main__":
    import sys
    main(sys.argv)

然后,您可以單獨測試main函數(只需使用您指定的一組arg調用main([...]) )。 請注意,這對於其他CLI框架也應(經過一些調整)起作用。


另外,請注意,如果確實使用argparse ,則需要修補ArgumentParser()以便在解析失敗時不調用sys.exit

一種簡單的方法是聲明一個ParsingError異常,並使用以下命令修補ArgumentParser.error(self, message)

def error(self, message):
    raise ParsingError(message) 

然后,您可以在測試中使用assertRaises

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM