使用rspec测试时,非空文件的File.read为空



对于rupy和rsspec来说,我正在尝试测试一个打开并写入文件的类。类名是SimpleLogger
这是生成错误的规范:

describe SimpleLogger do
...
context 'when using a file' do
require 'fakefs/spec_helpers'
before(:all) do
@path = 'my_file'
logger = SimpleLogger.new @path
logger.write "Hello, world!"
logger.close
end
...
it 'we expect the file to have a valid content' do
expect(File.read(@path)).to eq "Hello, world!n"
end
end
end

生成的错误为:

Failure/Error: expect(File.read(@path)).to eq "Hello, world!n"
expected: "Hello, world!n"
got: ""
(compared using ==)
Diff:
@@ -1,2 +1 @@
-Hello, world!

该文件存在于我的文件系统中,当我在独立的ruby文件上测试一个简单的puts Find.read("my_file")时,我得到了预期的结果。我已经测试过,在没有fakefs gem的情况下也有同样的问题

为什么它在规范中运行时不起作用?除此之外,我无法理解fakefs的优势,因为它创建的文件完全相同。那么为什么要使用fakefs呢?当它创建文件时,我应该在规范中删除它吗?

提前感谢;)

从文档来看,似乎需要包括激活FakeFS:的助手

FakeFS::SpecHelpers为RSpec示例组提供了一个简单的宏,用于打开和关闭FakeFS。要使用它,只需"fakefs/spec_helpers",然后将fakefs::SpecHelpers包含到任何您希望在中使用FakeFS的示例组。例如:

require 'fakefs/spec_helpers'
describe "Some specs that deal with files" do
include FakeFS::SpecHelpers
...
end

默认情况下,包括FakeFS::SpecHelpers将为描述块内的每个示例运行。如果您只想为所有示例打开一次FakeFS,则需要包括FakeFS::SpecHelpers::All。

或者,您可以使用RSpec在所有示例组中包含FakeFS::SpecHelpers规范助手中的配置块:

require 'fakefs/spec_helpers'
Spec::Runner.configure do |config|
config.include FakeFS::SpecHelpers
end

如果执行上述操作,那么use_fakefs将在所有示例组中可用。

您还需要使用before(:each)而不是before(:all)——与许多单元测试助手一样,FakeFS遵循单元测试隔离原则,其中一个测试的副作用不应影响另一个测试。这就是为什么每次测试后,gem都会"重置"其容器的状态,并清除其中的所有文件

相关内容

最新更新