Forum: Ruby on Rails Functional Testing

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
chris landry (Guest)
on 2006-03-19 04:36
(Received via mailing list)
Hey all,

I have a many-to-many relationship (Questions
has_and_belongs_to_many Answers), and when I destroy
the Question (the one) I also destroy all the Answers
(the many).
Since the following doesn't seem to work for
has_and_belongs_to_many:
class Question < AR::Base...
   has_and_belongs_to_many :answers, :dependent =>
:destroy
end

I have this embedded in a transaction block in the
controller action destroy, so that if any of the
destroy actions fail it will roll back.

This all works great, but I'm trying to figure out a
way I can write a functional test that tests one of
the Answer's failing to destroy and rolling back.
(I've tried to lock the database, rename it...but it
doesn't raise the exception I'm looking for)

Here's the code I'm working with. Any ideas?

def destroy
  begin
   Question.transaction() do
    Answer.transaction() do
      @question = Question.find(params[:id])
      for answer in question.answers
       if !answer.destroy
      #printf ("Answer %s on Question did not
destroy!\n", answer.id.to_s)
      raise ActiveRecord::RecordInvalid.new(answer),
"Error: Answer ID#:".concat(answer.id.to_s).concat("
on Test ID# ").concat(@exam.id.to_s).concat(" failed
to destory! <br /> Contact Administrator for help! ")
     end
      end
     if !question.destroy
       #printf ("Question %s on Section did not
destroy!\n", question.id.to_s)
       raise
ActiveRecord::RecordInvalid.new(question), "Error:
Question ID# ".concat(question.id.to_s).concat(" on
Test ID# ").concat(@exam.id.to_s).concat(" failed to
destory! <br /> Contact Administrator for help! ")
      end
      flash[:notice] = "Question and all Answers
successfully destroyed!"
      redirect_to :action => 'list'
   end
  rescue ActiveRecord::RecordInvalid => invalid
   redirect_to :action => 'show', :id => @exam,
:deleteError => invalid
  end
end

Thanks,
Chris Landry
Tom M. (Guest)
on 2006-03-19 13:17
(Received via mailing list)
Use a mock object to raise the error you're looking
for if a flag is set.

test/mocks/test/your_model.rb

require 'models/your_model'

class YourModel
   def destroy
     if @raise_error
       raise :Exception
     else
       super
     end
   end
end

--
-- Tom M.
This topic is locked and can not be replied to.