On 26 December 2011 22:09, Phillip Koebbe <phillip.koe...@gmail.com> wrote:
> > 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 > I always find replies useful and I thanked you for it. I didn't know about described_class, for example, so I learned something there. My request for having my macros more seamless was to do with them using the current environment they were running in (before blocks etc.) I have solved that by not being so dupid. I think too much good food over Christmas has made me even softer. -ants
_______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users