Как написать спецификацию контроллера rspec model_mock, которая не учитывает массовое назначение - PullRequest
2 голосов
/ 30 марта 2011

Я использую 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)

Большое спасибо заранее!

1 Ответ

3 голосов
/ 30 марта 2011

Для проверки против массового назначения.Вы должны повторить это.поэтому отправьте неверный идентификатор пользователя в запросе

post :create, :post => {'body' => 'hi there', 'user_id' => '2'}

, затем убедитесь, что созданный вами пост имеет идентификатор user_id, назначенный контроллером (при условии, что его идентификатор не равен 2 в этом примере)

assigns(:post)user_id.should be(current_user.id)
...