On Dec 26, 2011, at 12:09 PM, Ants Pants wrote: > > > On 26 December 2011 18:01, Phillip Koebbe <phillip.koe...@gmail.com> wrote: > > On Dec 26, 2011, at 10:06 AM, Ants Pants wrote: > > > Hello all, > > > > I trust you are having a good one. > > > > I'm just trying out macros and my first one is taken from the RSpec book > > which replaces ..... > > > > @obj.should_not be_valid > > @obj.should have(1).error_on(:attr) > > > > with the macro.... > > > > should_require_attribute Model, :attribute > > > > My first attempt is basic but already I have problems. > > > > The following is called as > > > > it_should_require_attribute Model, :attribute > > > > but I would rather call if as > > > > it_should_require_attribute @model, :attribute. > > > > I prefer this call as I want to use what has been setup in my before(:each) > > block -- setting @model and all other housekeeping stuff required for the > > tests -- and I can then remove dut_instance = dut.new from the macro. > > > > Alas, my before(:each) block is not being called!! I thought it would be > > called when the it in the macro is met. > > > > module ModelMacros > > ## dut - Domain Under Test > > ## aut - Attribute Under Test > > > > def it_should_require_attribute(dut, aut) > > it "is not valid with missing #{aut}" do > > dut_instance = dut.new > > dut_instance.send("#{aut}=", nil) > > dut_instance.should_not be_valid > > dut_instance.should have(1).error_on(aut.to_sym) > > end > > end > > end > > > > Could anyone give me some tips on how to approach macros better for > > seamless integration into my tests. > > > > I like to use self.described_class instead of passing classes or instances > in. Here is an example: > > def it_should_require_attribute(attribute) > klass = self.described_class > instance = klass.new > instance.send("#{attribute}=", nil) > instance.should_not be_valid > instance.should have(1).error_on(attribute.to_sym) > end > > describe MyModel do > it_should_require_attribute :some_attribute > end > > I'm still using RSpec 1.x on Rails 2.3.x projects and have no idea if this is > supported in RSpec 2.x. > > Peace. > > _______________________________________________ > rspec-users mailing list > rspec-users@rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users > > Thanks for your reply. > > Firstly, I was mistaken, my before block is being called when the it block is > met in my macro. > > I'm using rspec-rails 1.3.4 and Rails 2.3.11 > > Your code doesn't really help, though. It's just another way of addressing > what I'm already doing. As I now know my before block is begin called and I > have access to an instance variable, I tried a generic name @dut (Domain > Under Test) and that works. But, I have now lost a meaningful instance > variable name for non macro tests. Maybe I could just #dup them. >
Sorry, I should have been more specific. I wasn't addressing the issue you were having with the before block. I was addressing this: > Could anyone give me some tips on how to approach macros better for seamless > integration into my tests. Which I understood to mean that if anyone had any ideas about how to make the tests simpler/dryer/etc, you'd be happy to hear them. Sorry if I misunderstood and you didn't find it useful. Peace.
_______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users