在rspec / rails 4中存根File.expand_path

时间:2013-10-07 00:21:29

标签: rspec ruby-on-rails-4 factory-bot stub

我在代码中有多次调用File.expand_path(Rails.root)

用于测试我在spec / support

中创建了以下配置
RSpec.configure do |config|
  config.before(:each) do
    File.stub(:expand_path).and_return("spec/fs")
  end
end

因此,对File.expand_path的每个请求都不是“/ home / user /”,而是返回“spec / fs /”

当我在轨道3上时,它运作良好

然而,在移动到rails 4之后,测试开始抛出以下错误:

 Failure/Error: let(:category) { build(:category) }
 LoadError:
   cannot load such file -- spec/fs

为什么会出现/如何解决?

PS。

测试/模型非常基础,但奇怪的是这个测试用例失败了:

#in class
def first method(category)
  "#{File.expand_path(Rails.root)}/public/collections/#{self.name}/_new/#{category.name.downcase}"
end

#in rspec
describe "#first_method" do
  it { expect(collection.first_method(category)).to be_instance_of(String) }
end

但是这个没有!

#in class
def second_method
  "#{File.expand_path(Rails.root)}/public/collections/#{self.name}/_new/"
end

#in rspec
describe "#second_method" do
  it { expect(collection.second_method).to be_instance_of(String) }
end

类别工厂简单如下:

FactoryGirl.define do
  factory :category do
    name "TestCategory"
  end
end

用简单的

构建
let(:category) { build(:category) }

然而,在构建:category factory

时,似乎发生了存根故障

2 个答案:

答案 0 :(得分:1)

File.expand_path是一种非常常用的方法。如果Rails,RSpec或FactoryGirl软件依赖它作为代码的一部分,我会不会感到惊讶,这些代码在双精度到位后执行(例如加载Category模型代码)。您可以通过打印堆栈跟踪或在调用它并查看它所在位置时调试器来轻松验证。

答案 1 :(得分:0)

修复了将File.expand_path(Rails.root)定义为应用程序范围的环境相关常量,并将其修改为测试环境。