1

我正在开发一个 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
4

1 回答 1

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 不会在每个新测试中从头开始创建新的运行环境(正如我假设的那样)。得到教训。

于 2013-09-20T11:05:43.193 回答