Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
## 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
This paste will be private.
From the Design Piracy series on my blog: