Ruby 如何测试文件操作

Ruby 如何测试文件操作,ruby,unit-testing,file,testing,Ruby,Unit Testing,File,Testing,我听说在测试中访问数据库是错误的 但是文件操作呢?类似于文件utils中的、cp、mv、rm和touch方法 如果我编写一个测试并实际运行命令(移动文件、重命名文件、创建目录等等),我就可以测试它们。但在再次运行测试之前,我需要“撤消”我运行的每个命令。所以我决定把所有的代码都写成“undo”,但这似乎是浪费时间,因为我真的不需要“undo” 我真的很想看看别人是怎么做的。例如,当您生成大量静态文件时,您将如何进行测试?也许您可以在测试包中创建一个名为“test_*”的目录。然后,您更改的文件将

我听说在测试中访问数据库是错误的

但是文件操作呢?类似于文件utils中的、
cp
mv
rm
touch
方法

如果我编写一个测试并实际运行命令(移动文件、重命名文件、创建目录等等),我就可以测试它们。但在再次运行测试之前,我需要“撤消”我运行的每个命令。所以我决定把所有的代码都写成“undo”,但这似乎是浪费时间,因为我真的不需要“undo”


我真的很想看看别人是怎么做的。例如,当您生成大量静态文件时,您将如何进行测试?

也许您可以在测试包中创建一个名为“test_*”的目录。然后,您更改的文件将放在此目录中(例如:如果您创建了一个目录,您将在测试目录中创建该目录)。在测试结束时,您可以删除此目录(仅使用一个命令)。这是您将执行的唯一撤消操作


您将把测试所需的所有文件都放在测试包内的测试目录中。

访问数据库、文件系统、smtp服务器等资源对于单元测试来说是个坏主意。在某些时候,显然你必须用真实的文件进行测试,这是一种不同的测试,一种集成测试。集成测试更痛苦,您必须小心确保您的测试是从定义良好的状态开始的,而且由于您正在访问真实的文件系统,因此它们的运行速度会变慢。另一方面,您不应该像使用单元测试那样频繁地运行它们


对于单元测试,您应该能够利用duck类型来创建对象,这些对象对您正在使用的文件对象所具有的相同方法作出反应。此外,这种方法没有什么可撤销的,测试运行速度会快得多。

访问数据库并不是“测试中的错误”。您还将如何测试代码与数据库的集成


可重复测试的关键是一致的环境。只要您从相同的文件系统或数据库内容开始测试,您就不会错。这通常在测试套件开始时通过清理过程进行处理。

在您的情况下,访问文件是完全合法的,如果您正在编写文件操作代码,则应在文件上进行测试。您必须小心的一件事是,测试失败意味着您的代码是错误的,而不是有人删除了测试所需的文件或类似的东西。我会将测试所需的目录和文件放在一个单独的文件夹中,该文件夹仅用于测试。然后在构建测试时,将整个文件夹复制到一个临时位置进行所有测试,然后在测试后删除临时文件。这样,每个测试都有一个为测试保存的文件的干净副本

“纯”单元测试应包括文件系统、数据库

现在,您可能希望在单元测试的同时运行这些“集成”测试(或您所称的任何测试),并使用相同的框架(这很方便)


您可以有一组用于单元测试的文件,按照Janusz的回答中的建议复制到临时位置,或者在单元测试中生成它们,或者在单元测试时使用一个而不是真正的FileUtils

如果您的操作系统支持基于RAM的文件系统,您可以使用其中一种。这甚至还有一个优点,就是代码中偶尔出现一个
`unix命令`

我不知道模拟图书馆的事。谢谢