Я заставлял себя изучать Rails4 с BDD, и до сих пор это получалось довольно хорошо. Тем не менее, я уже несколько часов занимаюсь этой проблемой и не могу найти причину, по которой она не работает. В настоящее время я работаю над тестированием контроллеров, со встроенными только контроллерами и моделями, без форм или чего-либо еще. Он работает через консоль, поэтому я просто использую что-то не так.
Вот мой код для справки:
/admin/pages_controller.rb
class Admin::PagesController < ApplicationController
def update
@page = Page.find_by_id(params[:id])
@page.update_attributes!(message_params)
redirect_to edit_admin_page_path(@page)
end
private
def message_params
params.require(:page).permit(
:url,
:position,
:name,
:tags,
images_attributes:
[:image_file_name, :image_file_size, :image_content_type, :name, :caption, :tags, :owner_id, :owner_type],
block_attributes:
[:id, :body, :owner_id, :owner_type]
)
end
end
модели/page.rb
class Page < ActiveRecord::Base
validates :name, presence: true
before_save :validate_url
has_many :images, :as => :owner
has_one :block, :as => :owner
accepts_nested_attributes_for :images, :block
def validate_url
if url.blank?
self.url = self.name.strip.downcase.gsub(" ","-").gsub(%r([^0-9a-z-]), '').gsub("--","-")
end
end
end
pages_controller_spec.rb
describe "POST #update" do
before :each do
@page = FactoryGirl.create(:page)
end
it "makes sure user can upload an image" do
image = FactoryGirl.build(:image, owner_id: @page.id, owner_type: "Page")
post :update, id: @page, page: { :images => [ image ]}
@page.reload
expect(@page.images.first).to eq(image)
end
it "updates values of the attributes accordingly" do
post :update, id: @page, page: { :name => 'foo', :url => 'bar' }
@page.reload
expect(@page.name).to eq('foo')
end
it "updates the values of the block" do
@page = FactoryGirl.create(:page_with_block)
post :update, id: @page, page: { block: { :body => 'foobar' } }
@page.reload
expect(@page.block.body).to eq('foobar')
end
end
спец/фабрики/blocks.rb
FactoryGirl.define do
factory :block do
body "<html><body><h1>Hello world!</h1><section>This is the content section</section></body></html>"
end
end
спец/фабрики/images.rb
include ActionDispatch::TestProcess
FactoryGirl.define do
factory :image do
image { fixture_file_upload Rails.root.to_s + '/spec/images/1.jpg', 'image/jpg'}
name { Faker::App.name }
caption { Faker::Lorem.sentence }
tags { Faker::Lorem.words }
end
end
Результаты RSpec:
1) Admin::PagesController POST #update makes sure user can upload an image
Failure/Error: expect(@page.images.first).to eq(image)
expected: #<Image id: nil, image_file_name: "1.jpg", image_file_size: 15078, image_content_type: "image/jpg", name: "Alpha", caption: "Assumenda et exercitationem quo.", tags: ["doloribus", "maiores", "dicta"], owner_id: 37, owner_type: "Page", created_at: nil, updated_at: nil>
got: nil
(compared using ==)
# ./spec/controllers/admin/pages_controller_spec.rb:111:in `block (3 levels) in <top (required)>'
2) Admin::PagesController POST #update updates the values of the block
Failure/Error: expect(@page.block.body).to eq('foobar')
expected: "foobar"
got: "<html><body><h1>Hello world!</h1><section>This is the content section</section></body></html>"
(compared using ==)
# ./spec/controllers/admin/pages_controller_spec.rb:124:in `block (3 levels) in <top (required)>'
Finished in 3.95 seconds (files took 3.71 seconds to load)
19 examples, 2 failures
модели/image.rb
class Image < ActiveRecord::Base
validates_presence_of :image_file_name, :image_file_size, :image_content_type
before_save :clean_up
belongs_to :page, foreign_key: "owner_id"
has_attached_file :image
validates_attachment_content_type(:image, :content_type => /^image\/(jpg|jpeg|pjpeg|png|x-png|gif)$/)
validates :image, :attachment_presence => true
def clean_up
if name.blank?
self.name = self.image_file_name.strip.downcase.gsub(" ","-").gsub(%r([^0-9a-z-]), '').gsub("--","-")
end
end
end
Любая помощь будет оценена по этому вопросу, так как большинство поисковых запросов, которые я нашел по этому вопросу, касаются форм или params.require. Я могу обновить атрибуты самой страницы с помощью второй спецификации, но ничего из того, что я делаю, не попадает во вложенные ресурсы. Что мне здесь не хватает? Заранее спасибо!
Изменить: обновлено, чтобы включить модель изображения
Image
класс. Опубликуйте это, и я дам вам знать, что вы должны делать. - person ole   schedule 24.04.2015