![](/img/trans.png)
[英]In order to test a function with unit testing, does it need to have a return value?
[英]Unit testing a method with no return value
對這樣的方法進行單元測試的優雅方法是什么?
from feedgen.feed import FeedGenerator
def generate_feed(file_list):
fg = FeedGenerator()
for f in file_list:
fe = fg.add_entry()
fg.rss_str(pretty=True)
fg.rss_file('podcast.xml')
顯然該方法不返回任何值,而是寫入 xml 文件。 有沒有一種優雅的單元測試方式? 或者我應該考慮重構我的方法以使其對單元測試更加友好並針對某些東西進行斷言?
執行此操作的標准方法是使用patch
和mock
來模擬FeedGenerator
class。
如果您將FeedGenerator
作為參數傳入,則無需patch
:
def generate_feed(file_list: List[File], fg: FeedGenerator) -> None:
# do stuff to fg based on file_list
現在你的測試可以做:
file_list = [File("foo"), File("bar")] # or whatever?
fg = MagicMock(spec=FeedGenerator)
generate_feed(file_list, fg)
assert fg.add_entry.call_count == len(file_list)
# etc
rss_file
可以將文件名或類似文件的 object 作為其參數。 重寫generate_feed
以接受傳遞給rss_file
的參數。
def generate_feed(file_list, fobj="podcast.xml"):
fg = FeedGenetaror()
for f in file_list:
fe = fg.add_entry()
fg.rss_str(pretty=True)
fg.rss_file(fobj)
在生產中,您可以編寫
with open("podcast.xml", "w") as f:
generate_feed(file_list, f)
或者干脆
generate_feed(file_list)
對於測試,您可以使用StringIO
。
f = io.StringIO()
generate_feed(file_list, f)
然后您可以測試f
的內容(通過f.getvalue()
),就好像它是您生成的 XML 文件一樣。
您可以測試是否在正確的路徑中實際創建了文件,然后在適用於您的情況下將其刪除(因為這只是一個測試)。 您甚至可以閱讀該文件以查看其設置是否正確。
您還可以讓 function 在寫入文件成功或失敗時返回True
或False
,並對其進行測試(例如,如果您知道存在應該失敗的邊緣情況)。
另一個有用的測試是檢查該方法在各種條件下是否不會引發錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.