我正在尝试编写一些涉及文件操作的测试。我想使用一些伪文件系统(类似于外部服务的VCR),我找到了fakeFS。不幸的是,要么我不能正确设置或者某些事情被打破(我怀疑它是非常基本的功能),我已经准备好了简单的例子来说明我的意思,让代码说话:
使用真正的FS:
module MyModule
describe Something do
before(:all) do
File.open("#{Rails.root}/foo.txt", 'w+') { |f| f.write 'content'}
end
it 'should exist' do
expect(Pathname.new("#{Rails.root}/foo.txt").exist?).to be_true
end
it 'should still exist' do
expect(Pathname.new("#{Rails.root}/foo.txt").exist?).to be_true
end
end
end
运行它给出:
bash-4.2$ rspec
..
Finished in 0.00161 seconds
2 examples, 0 failures
以这种方式添加fakeFS
:
require 'fakefs/spec_helpers'
module MyModule
describe Something do
include FakeFS::SpecHelpers
FakeFS.activate!
FakeFS::FileSystem.clone(Rails.root)
before(:all) do
File.open("#{Rails.root}/foo.txt", 'w+') { |f| f.write 'content'}
end
it 'should exist' do
expect(Pathname.new("#{Rails.root}/foo.txt").exist?).to be_true
end
it 'should still exist' do
expect(Pathname.new("#{Rails.root}/foo.txt").exist?).to be_true
end
end
end
结果:
bash-4.2$ rspec
.F
Failures:
1) MyModule::Something should still exist
Failure/Error: expect(Pathname.new("#{Rails.root}/foo.txt").exist?).to be_true
expected: true value
got: false
# ./spec/models/something_spec.rb:23:in `block (2 levels) in <module:MyModule>'
Finished in 0.00354 seconds
2 examples, 1 failure
因此,似乎文件不会通过后续测试持久化。我是否误解before(:all)
如何运作或我做错了什么?如果是这样,为什么该代码适用于真实文件?
如果'不是一个bug,只是一个功能',那么还有其他任何假文件系统宝石与真实宝石一致吗?或者我是否必须继续使用真实文件来进行测试......好吧,测试?
答案 0 :(得分:2)
我在创建这个问题之后找到了答案,呃;)我已经查看了该lib的来源并找到了suspicious line。
而不是FakeFS::SpecHelpers
我已经包含FakeFS::SpecHelpers::All
除了FakeFS::FileSystem
之外的相同代码在每次调用后都没有被清除,现在它的行为正确。