Я использую rspec для тестирования контроллера, который использует модель с объявленным attr_accessible. Я не хочу проверять, работает ли attr_accesible (это делает моя спецификация модели), но я хочу убедиться, что мой контроллер не выполняет массовое назначение.
Конкретно у меня модель такая:
class Post < ActiveRecord::Base
attr_accessible :body
validates :body, :presence => true,
validates :user, :presence => true
belongs_to :user
end
и слегка настроенный сгенерированный контроллер (удалены строки формата xml):
def create
# this line keeps the rspec test mock happy
@post = Post.new(params[:post].merge(:user => current_user))
# Below are the correct lines of code for runtime for attr_accessible
# @post = Post.new(params[:post])
# @post.user = current_user
respond_to do |format|
if @post.save
format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
else
format.html { render :action => "new" }
end
end
end
У меня есть тест rspec с фиктивным контроллером, который проходит с вышеуказанным:
describe "POST create" do
describe "with valid params" do
it "assigns a newly created post as @post" do
Post.stub(:new).
with({'body' => 'hi there', 'user' => @user}) { mock_post(:save => true) }
post :create, :post => {'body' => 'hi there'}
assigns(:post).should be(mock_post)
end
end
end
Я хочу изменить тест rspec, чтобы он правильно проверял контроллер, когда я закомментировал первую строку @post и раскомментировал следующие две строки @post. Таким образом, я буду проверять, что контроллер будет работать правильно с реальной моделью, но я могу продолжать использовать макеты для тестирования. Я перепробовал несколько подходов и, кажется, ходил кругами (и да, я новичок в Rails и Rspect: p)
Большое спасибо заранее!