[英]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.