使用Rspec和真实文件系统的FakeFS和Rspec incosistency

时间:2013-12-08 22:50:08

标签: ruby-on-rails rspec filesystems rspec-rails

我正在尝试编写一些涉及文件操作的测试。我想使用一些伪文件系统(类似于外部服务的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,只是一个功能',那么还有其他任何假文件系统宝石与真实宝石一致吗?或者我是否必须继续使用真实文件来进行测试......好吧,测试?

1 个答案:

答案 0 :(得分:2)

我在创建这个问题之后找到了答案,呃;)我已经查看了该lib的来源并找到了suspicious line

而不是FakeFS::SpecHelpers我已经包含FakeFS::SpecHelpers::All除了FakeFS::FileSystem之外的相同代码在每次调用后都没有被清除,现在它的行为正确。