无返回值的单元测试方法

2024-10-03 09:14:41 发布

您现在位置:Python中文网/ 问答频道 /正文

对这样的方法进行单元测试的一种优雅的方法是什么

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文件。有没有一种优雅的单元测试方法?或者我应该研究重构我的方法,使它更易于单元测试并针对某些东西进行断言


Tags: 方法fromimportfordeffeedxml单元测试
3条回答

rss_file可以采用文件名或类似文件的对象作为其参数。重写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文件一样

您可以测试文件是否在正确的路径中创建,然后删除它(因为这只是一个测试),如果这对您适用的话。您甚至可以读取该文件以查看其设置是否正确

您还可以让函数在写入文件成功或失败时返回TrueFalse,并测试这些情况(例如,如果您知道有应该失败的边缘情况)

另一个有用的测试就是检查这个方法在各种情况下不会产生错误

标准的方法是使用patchmock来模拟FeedGenerator

如果将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

相关问题 更多 >