我正在使用pyinotify将文件从源目录镜像到目标目录。当我手动执行它时,我的代码似乎正在工作,但我无法获得准确的单元测试结果。我认为问题归结为:
- 我必须在我的测试中使用ThreadedNotifier ,否则它们只会挂起,等待手动输入。
- 因为我正在使用另一个线程,所以我的测试和通知程序不同步。在运行观察性手动测试时通过的测试在运行单元测试时会失败。
有没有人成功对 pyinotify 进行单元测试?
我正在使用pyinotify将文件从源目录镜像到目标目录。当我手动执行它时,我的代码似乎正在工作,但我无法获得准确的单元测试结果。我认为问题归结为:
有没有人成功对 pyinotify 进行单元测试?
在进行单元测试时,线程和文件系统之类的东西通常应该被排除在外。您是否有理由使用实际的文件系统、用户输入等进行单元测试?
Python 使得猴子补丁变得非常容易;例如,您可以将整个 os/sys 模块替换为模拟对象(例如Python Mock),这样您就无需处理文件系统。这也将使您的测试运行得更快。
如果您想对文件系统进行功能测试,我建议您设置一个具有已知状态的虚拟机,并在每次运行测试时恢复到该状态。您还可以根据需要模拟用户输入、文件操作等。
编辑
这是一个如何伪造或模拟“open”函数的简单示例。
假设你有一个my_module
带有get_text_upper
函数的模块:
def get_text_upper(filename):
return open(filename).read().upper()
您希望在不实际接触文件系统的情况下对此进行测试(最终您将开始只传递文件对象而不是文件名以避免这种情况,但现在......)。您可以模拟该open
函数,以便它返回一个 StringIO 对象:
from cStringIO import StringIO
def fake_open(text):
fp = StringIO()
fp.write(text)
fp.seek(0)
return fp
def test_get_text():
my_module.open = lambda *args, **kwargs : fake_open("foo")
text = my_module.get_text_upper("foo.txt")
assert text == "FOO", text
使用模拟库只会让这个过程变得更容易和更灵活。