Resetting fixtures for each iteration within a single test

Hi,

I want to reset the fixture data manually during a single test. I know this action is performed between tests, but I need to trigger it within a single test.

I need this because I have a directory full of test data (xml files) which need to be sent to the application and validated for their response. These files are all sent to a single controller action, which dispatches the request to the appropriate Restful controller/ action. This controller mainly exists for backward compatibility reasons which do not map to Restful controllers. I already have tests on the Restful controller actions, but I want to run this dispatching test as well. So what I do now is create a single test which iterates over all these files and after each run reset! the session for the next run.

class DispatcherControllerTest < Test::Unit::TestCase

  def test_all_xml_files     all_files.each do |file|       post :submit, file       ...assertions...       reset!     end   end

end

The problem is that the submitted files change the state of the application. I don't want the tests to be dependent of each other so I want to reset the fixture data after each iteration, but I can't find the method to do this.

Does anybody know how to reset the fixtures manually during a single test?

Thanks in advance, Bas van Westing

You need to rollback the current database transaction and start a new one. An alternative method would be to dynamically generate a testcase for each data file you have.

Fred

Hi Fred,

Thanks for your response. Can you also give me the statement which rolls back the current database transaction?

Regards, Bas

Hi Fred,

Thanks for your response. Can you also give the statement for rolling back the current database transaction?

  ActiveRecord::Base.connection.rollback_db_transaction   ActiveRecord::Base.connection.begin_db_transaction

Fred

Fred,

Thanks for your help. I ended up generating the test cases dynamically as you suggested. This gives nicer test outputs in case of failing test cases. Ruby is so beautiful...

class DispatcherControllerTest < Test::Unit::TestCase

  Dir.glob( "#{File.dirname(__FILE__)}/../internal/*input.xml" ).each do |input_filename|     output_filename = input_filename.gsub( 'input.xml', 'output.xml')     next unless File.exists?( output_filename )     method_name = "test_internal_#{File.basename(input_filename, '.xml')}"     define_method( method_name ) do       ...Actual method contents here, comparing the response with the expected output file.....     end   end

end