我正在尝试用黄瓜和水豚来测试我的应用程序。 我有以下步骤定义:
Given(/^I fill in the create article form with the valid article data$/) do
@article_attributes = FactoryGirl.build(:article)
within("#new_article") do
fill_in('article_title', with: @article_attributes.title)
attach_file('article_image', @article_attributes.image)
fill_in('article_description', with: @article_attributes.description)
fill_in('article_key_words', with: @article_attributes.key_words)
fill_in('article_body', with: @article_attributes.body)
end
我的文章工厂看起来像这样:
FactoryGirl.define do
factory :article do
sequence(:title) {|n| "Title #{n}"}
description 'Description'
key_words 'Key word'
image { File.open(File.join(Rails.root, '/spec/support/example.jpg')) }
body 'Lorem...'
association :admin, strategy: :build
end
end
这是我的上传者文件:
# encoding: UTF-8
class ArticleImageUploader < CarrierWave::Uploader::Base
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
def extension_white_list
%w(jpg jpeg gif png)
end
end
但是每次我运行这个场景时都会收到ERROR消息:
Given I fill in the create article form with the valid article data # features/step_definitions/blog_owner_creating_article.rb:1
cannot attach file, /uploads/article/image/1/example.jpg does not exist (Capybara::FileNotFound)
./features/step_definitions/blog_owner_creating_article.rb:5:in `block (2 levels) in <top (required)>'
./features/step_definitions/blog_owner_creating_article.rb:3:in `/^I fill in the create article form with the valid article data$/'
features/blog_owner_creating_article.feature:13:in `Given I fill in the create article form with the valid article data'
我还发现当我在rails测试控制台中运行image:nil
时,FactoryGirl会返回FactoryGirl.build(:article)
。
有人可以解释一下我做错了吗?
答案 0 :(得分:10)
您需要直接传递路径:
attach_file('article_image', File.join(Rails.root, '/spec/support/example.jpg'))
这里发生的是attach_file
期望一个字符串,而不是CarrierWave上传者。当您向其传递上传者(@article_attributes.image
)时,attach_file
正在调用Uploader#to_s
,其中会调用Uploader#path
。由于您尚未保存文章,因此上传图片所在的路径无效。
另请注意,调用变量@article_attributes
会让人感到困惑,因为它实际上是一个完整的文章对象,而不仅仅是一个哈希。如果这是您想要的,您可以尝试FactoryGirl.attributes_for(:article)
。