打开()从非文件读取?

时间:2015-04-28 17:28:10

标签: python-3.x

我意识到这是一个非常奇怪的事情 - 它主要是为了简化我的单元测试。

我有一个类__init__以文件名作为参数,它是open()并从中读取一堆数据。如果我能以某种方式“欺骗”open()从字符串对象读取而不实际将临时文件写入磁盘,那真是太棒了。

这是可能的,如果可以的话,我该怎么做呢?

2 个答案:

答案 0 :(得分:1)

您可以在运行测试之前修补包含该类的模块,并在测试后将其恢复:

def my_fake_open(fake_filename):
    return object_with_read_and_close_that_will_feed_correct_data()

def test_something(self):
    module_containing_test.open = my_fake_open
    ...run test...
    del module_containing_test.open

如果您不想编写自己的模拟对象,请查看mock library

答案 1 :(得分:0)

读得有点太快了,我认为答案会在io.stringIO中,它允许你用字符串的内容创建一个类似文件的对象。

但是你想要的是一个传递给标准open函数的对象实际上会从你的字符串内容中产生一个类似文件的对象。

问题是open采用字符串(或文件描述符),但其他任何东西都会暂停问题。

所以我不相信这种方式很实用。

但实际上,使用tempfile创建文件并不困难:

with tempfile.NamedTemporaryFile() as tmp_file:
    tmp_file.write(your_string)
    yourmodule.YourClass(tmp_file.name)

(如果您使用的是Windows,则可能需要使用delete=False并在发送名称之前关闭,然后才能打开它。)

另一种方法可能只是更改API:如果所有init都使用名称来打开文件,为什么不直接传递类似文件的对象。