我意识到这是一个非常奇怪的事情 - 它主要是为了简化我的单元测试。
我有一个类__init__
以文件名作为参数,它是open()
并从中读取一堆数据。如果我能以某种方式“欺骗”open()
从字符串对象读取而不实际将临时文件写入磁盘,那真是太棒了。
这是可能的,如果可以的话,我该怎么做呢?
答案 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都使用名称来打开文件,为什么不直接传递类似文件的对象。