Dir.pwd()在Rspec测试中返回nil?

时间:2013-09-20 04:06:13

标签: ruby rspec

我正在开发一个Ruby应用程序,它需要具有特定的目录结构才能正常工作。为了确保这种情况,我创建了一些用于测试的临时目录(rspec)。我试图保存当前目录,并在测试完成后恢复它,但看起来Dir.pwd()返回nil。是否有可能没有当前目录?这在任何地方都没有记录......

代码:

before :each do
  # make a directory to work in
  @olddir = Dir.pwd()               #=> returns nil???
  @dir = Dir.mktmpdir('jekyll')
end

after :each do
  Dir.chdir(@olddir)                #=> this fails
  FileUtils.rm_rf(@dir)
end

it "should not blow up" do
  1.should == 1
end

如果我将其更改为此工作正常,但无缘无故地更改为主目录似乎是不好的形式:

before :each do
  @dir = Dir.mktmpdir('jekyll')
end

after :each do
  Dir.chdir()                      #=> works, but feels wrong
  FileUtils.rm_rf(@dir)
end

it "should not blow up" do
  1.should == 1
end

1 个答案:

答案 0 :(得分:2)

我正在回答我自己的问题,因为我弄清楚出了什么问题。我应该包括整个测试(duh),看起来更像是这样:

context 'one' do
  before :all do
    # make a directory to work in
    @dir = Dir.mktmpdir('foo')
  end

  after :all do
    FileUtils.rm_rf(@dir)
  end

  it 'should not blow up' do
    1.should == 1
  end
end   # end context 'one'

context 'two' do
  before :each do
    # make a directory to work in
    @olddir = Dir.pwd()
    @dir = Dir.mktmpdir('bar')
    Dir.chdir(@dir)
  end

  after :each do
    Dir.chdir(@olddir)
    FileUtils.rm_rf(@dir)
  end

  it "should not blow up" do
    1.should == 1
  end
end   # end context 'two'

问题(当然,现在很明显)是我删除pwd并获得ENOENT,因为当前目录已取消链接。这没有在Ruby中记录,因为它是一个文件系统错误,而不是Ruby代码中的错误。

我认为,从每次新测试开始,rspec都不会从头开始创建新的运行环境(正如我所假设的那样)。经验教训。