0

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

为了测试我在规范/支持中创建了以下配置

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/”

当我在 Rails 3 上时它运行良好

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

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

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

附言。

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

#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 工厂时发生

4

2 回答 2

1

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

于 2013-10-07T04:03:03.880 回答
0

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

于 2013-10-07T13:41:37.423 回答