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

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文件。是否有一种优雅的单元测试方法?还是我应该考虑重构我的方法,以使其更易于进行单元测试并针对某些事物进行断言?

最佳答案

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文件一样。

09-07 08:54