To answer myself, I've put together the following work-around: http://www.swombat.com/getting-rspec-beforeall-and-nested-contexts-w
Still, would love to know if there was a better, less hackish way to do it. Daniel On Thu, Jul 9, 2009 at 11:40 AM, Daniel Tenner <daniel.rs...@tenner.org>wrote: > Hi all, > Like everyone (?), I use nested contexts to keep my specs well organised > and tidy. > > However, I have a problem. I have various sets of specs that needs to > perform very time-expensive operations to set up the fixtures that will be > examined in the tests. Two specific examples: testing access control logic > (requires creating a whole tree of items to verify the correct access level > against each item), and project archival (which creates a project, fills it > with test data, archives/zips the project contents, then unzips them for > examination). > > I tried using before(:all) to set up those costly fixtures, however I hit > upon a feature of rspec that made that less than successful: > > When using before(:all) along with nested contexts, rspec actually re-runs > the before(:all) before each sub-context. So if, like me, you have your > specs neatly organised in sub-contexts, the before(:all) is actually re-run > many times. > > Interestingly, when a before(:all) is run in the root context, rspec does > not actually remove the data from the database when re-running the > before(:all). "Great," I then thought, "I can just detect whether the data > is created and decide whether or not to create the objects on that basis". > Not so fast, though: Rspec may not clobber the database, but it does clobber > instance variables. In the case of the access control test, there's about 40 > different instance variables, so keeping track of them all manually in some > global variable outside of rspec would be messy to say the least... > > So my question is, is there any workaround for successfully using > before(:all) and nested specs, so that code like the following works and > doesn't run the expensive operation more than once: > > describe "Some functionality" do > before(:all) do > @variable = some_expensive_operation > end > > it "should do something" do > @variable.should do_something > end > > describe "in a specific context" do > it "should do another thing" do > @variable.should do_another_thing > end > end > end > > Worth noting that I'm quite happy to give up the ability to have before > blocks in the sub-contexts in order to ensure that the expensive operation > is only run once... > > Your thoughts most welcome... (including, perhaps, telling me that I'm > Doing It Wrong) > > Daniel Tenner > http://www.woobius.com > http://danieltenner.com >
_______________________________________________ rspec-users mailing list rspec-users@rubyforge.org http://rubyforge.org/mailman/listinfo/rspec-users