Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 固定假rspec“;照片罐';“不要空白”;Carrierwave的故障_Ruby On Rails_Ruby On Rails 3_Rspec_Carrierwave_Factory Bot - Fatal编程技术网

Ruby on rails 固定假rspec“;照片罐';“不要空白”;Carrierwave的故障

Ruby on rails 固定假rspec“;照片罐';“不要空白”;Carrierwave的故障,ruby-on-rails,ruby-on-rails-3,rspec,carrierwave,factory-bot,Ruby On Rails,Ruby On Rails 3,Rspec,Carrierwave,Factory Bot,我有一个Rails 3应用程序,它使用rspec进行测试,并使用Carrierwave进行图像上传。现在,我们有一个Profile模型,它有几个图像字段,例如:photo1和photo2 我的rspec测试将偶尔失败(通常在CI服务器上,但偶尔在我的本地计算机上),错误如下: Failure/Error: let(:profile) { create(:profile) } ActiveRecord::RecordInvalid: Validation failed: Image

我有一个Rails 3应用程序,它使用rspec进行测试,并使用Carrierwave进行图像上传。现在,我们有一个
Profile
模型,它有几个图像字段,例如:
photo1
photo2

我的rspec测试将偶尔失败(通常在CI服务器上,但偶尔在我的本地计算机上),错误如下:

 Failure/Error: let(:profile) { create(:profile) }
  ActiveRecord::RecordInvalid:
    Validation failed: Image can't be blank
Profile
模型的图像来源于
Rails.root.join
,例如:

IMAGE_1 ||= File.open(Rails.root.join('spec/fixtures/p1.jpg'))
IMAGE_2 ||= File.open(Rails.root.join('spec/fixtures/p2.jpg'))

FactoryGirl.define do
  factory :profile do
    ...
    photo1 IMAGE_1
    photo2 IMAGE_2
    ...
  end
end
由于这些虚假故障偶尔发生,且不易再现,我认为发生这种情况的原因是,有时在测试进行时,图像“加载”的速度不够快。它们通常出现在spec文件中的
build
create
方法上,因为这是测试验证的时候


如何更改此体系结构/代码以使测试通过?我已经了解了建议使用NullStorage类的建议,该类实现了存储提供程序的最小接口。然而,虽然此解决方案在技术上确实修复了错误的故障,但这意味着必须删除图像上使用的每种方法,这既繁琐又难以维护。是否有其他人在使用该解决方案,或者是否有更好的方法?

如果文件内容无关紧要,则这将防止出现任何“验证失败:文件不能为空”错误

FactoryGirl.define do
  factory :profile do
    ...
    photo1 File.open("/dev/null")
    photo2 File.open("/dev/null")
    ...
  end
end
如果内容真的很重要,那么阅读和回放可能会有所帮助

IMAGE_1 ||= File.open(Rails.root.join('spec/fixtures/p1.jpg'))
IMAGE_1.read(1) #read first byte
IMAGE_1.rewind #reset IO pointer to beginning

我看到了非常奇怪的故障-Carrierwave上载的文件内容在某些CI runner服务器上是空的,但在其他服务器上不是!我在工厂中使用的不是File.open(…),而是Rack::Test::UploadedFile.new(文件名)。更改为File.open为我解决了这个问题。Rails 5.2.4.5、Carrierwave-1.3.2、Ruby 2.5.0