Rspec, метод-заглушка и возвращает предопределенное значение - PullRequest
3 голосов
/ 24 декабря 2010

Я хочу проверить это действие уничтожения:

  def destroy
   @comment = Comment.find(params[:id])
   @comment_id = @comment.id
   if @comment.delete_permission(current_user.id)
     @remove_comment = true
     @comment.destroy
   else
     @remove_comment = false
     head :forbidden
   end
 end

Моя спецификация такая:

    describe "DELETE 'destroy'" do
      describe 'via ajx' do
        it "should be successful if permission true" do
          comment = Comment.stub(:find).with(37).and_return @comment
          comment.should_receive(:delete_permission).with(@user.id).and_return true
          comment.should_receive(:destroy)

          delete 'destroy', :id => 37
        end
      end
    end

Я всегда получаю:

comment.should_receive....
expected: 1 time
received: 0 times

Почему: delete_permissionникогда не называется?Есть ли у вас какие-либо предложения о том, как это проверить?

1 Ответ

6 голосов
/ 24 декабря 2010

Вы говорите Comment.find вернуть @comment, но вы никогда не устанавливаете ожидание delete_permission для этого объекта;Вы устанавливаете его на значение, возвращаемое вызовом stub, локальной переменной comment.

Попробуйте:

# As Jimmy Cuadra notes, we have no idea what you've assigned to @comment
# But if you're not doing anything super weird, this should work
@comment.should_receive(:delete_permission).with(@user.id).and_return(true)
@comment.should_receive(:destroy)

Comment.stub(:find).with(37).and_return(@comment)
...