簡體   English   中英

對沒有返回值的方法進行單元測試

[英]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 文件。 有沒有一種優雅的單元測試方式? 或者我應該考慮重構我的方法以使其對單元測試更加友好並針對某些東西進行斷言?

執行此操作的標准方法是使用patchmock來模擬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 在寫入文件成功或失敗時返回TrueFalse ,並對其進行測試(例如,如果您知道存在應該失敗的邊緣情況)。

另一個有用的測試是檢查該方法在各種條件下是否不會引發錯誤。

暫無
暫無

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

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