Report abuse

Bringing matrix goodness to your unit tests (see http://seancribbs.com/tech/2007/07/04/metaprogramming-unit-tests-part-2)


			
def self.params(*args)
  @@parameters = args.flatten
end

def self.valid_create(*args, &block)
  klass = self.name.chomp("Test")
  @@valid_creations ||= 0
  @@valid_creations += 1
  count = @@valid_creations
  zipped_args = @@parameters.zip(args).inject([]) {|memo, item| memo += item }
  params = Hash[*zipped_args]
  define_method "test_valid_create_#{@@valid_creations}" do
    assert_difference klass.constantize, :count do
      object = send("create_#{klass.underscore}", params)
      assert !object.new_record?, "v#{count}: #{object.errors.full_messages.to_sentence}"
      assert block.call(object) if block
    end
  end
end

def self.invalid_create(*args, &block)
  klass = self.name.chomp("Test")
  @@invalid_creations ||= 0
  @@invalid_creations += 1
  count = @@invalid_creations
  zipped_args = @@parameters.zip(args).inject([]) {|memo, item| memo += item }
  params = Hash[*zipped_args]
  define_method "test_invalid_create_#{@@invalid_creations}" do 
    assert_no_difference klass.constantize, :count do
      object = send("create_#{klass.underscore}", params)
      puts "i#{count}: #{object.errors.full_messages.to_sentence}"
      assert block.call(object) if block
    end
  end
end