Cucumberists:
Apologies for not jumping into some wild alternate fixture (or mock!) system,
but the unit tests at my new day gig are >cough< hanging by a thread as it
is.
I need to show off some cute Cuke, _without_ rocking the boat!
How do I actually use real, pre-existing Rails fixtures, the same as the unit
tests use? For familiarity?
Putting this at the top of the step.rb seems just a leeettle bit tacky...
$fixtures_installed ||= (
ENV[''RAILS_ENV''] = ''test''
RAILS_ENV.replace(''test'')
system(''rake db:fixtures:load'') )
I have attempted to load Rails Fixtures on demand before, and I''m the
first to
admit their architecture sucks - loading them on demand ain''t pretty!
And exactly why was ''rake features'' running in
RAILS_ENV=development mode? Do
developers _like_ having their scratch database screwed up each time they run
fixtures? Enquiring minds want to know!
--
Phlip
Phlip wrote:> Cucumberists:FYI, Cucumber now has it''s own mailing list: http://groups.google.com/group/cukes> > Apologies for not jumping into some wild alternate fixture (or mock!) > system, but the unit tests at my new day gig are >cough< hanging by a > thread as it is. > > I need to show off some cute Cuke, _without_ rocking the boat! > > How do I actually use real, pre-existing Rails fixtures, the same as > the unit tests use? For familiarity?http://wiki.github.com/aslakhellesoy/cucumber/fixtures -Ben
Ben Mabey wrote:> http://wiki.github.com/aslakhellesoy/cucumber/fixturesDing! That would have been my next click in my Googling. Let''s hope this thread pushes that up. > http://groups.google.com/group/cukes What, no gmane yet?? (-: -- Phlip
> Ben Mabey wrote: > >> http://wiki.github.com/aslakhellesoy/cucumber/fixtures > > Ding! That would have been my next click in my Googling. Let''s hope > this thread pushes that up. > > > http://groups.google.com/group/cukes > > What, no gmane yet?? (-: >I would have preferred: "I have set up GMane" Thanks Philip ;-)> -- > Phlip > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users
> >> Ben Mabey wrote: >> >>> http://wiki.github.com/aslakhellesoy/cucumber/fixtures >> >> Ding! That would have been my next click in my Googling. Let''s hope this >> thread pushes that up. >> >> > http://groups.google.com/group/cukes >> >> What, no gmane yet?? (-: >> > I would have preferred: "I have set up GMane" > > Thanks Philip ;-)Sorry about the spelling Phlip Aklas>> >> -- >> ?Phlip >> >> _______________________________________________ >> rspec-users mailing list >> rspec-users at rubyforge.org >> http://rubyforge.org/mailman/listinfo/rspec-users >
aslak hellesoy wrote:>>> http://groups.google.com/group/cukes>> What, no gmane yet?? (-:> I would have preferred: "I have set up GMane"Netiquette: I would _not_ set someone else''s group up on GMane - even if it were just a Google Group... -- Phlip http://flea.sourceforge.net/resume.html
>> How do I actually use real, pre-existing Rails fixtures, the same as >> the unit tests use? For familiarity?What I was missing is the regular use of fixtures as in rspec or test unit, like so: u = users(:bob) u.email = "aaa" u.should_not be_valid This link> > http://wiki.github.com/aslakhellesoy/cucumber/fixtures >described how to get fixtures loaded for the entire suite, so that you can say: u = User.find(1) or u = User.find_by_name("Bob") this is kind of a drag, if you have a well formed fixture file with symbolic names, etc. So I came up with this (which was developed and tested in Cucumber gem version 0.2.3, and I haven''t tried it yet with the latest 0.3.9): Add this to your env file: Fixtures.reset_cache fixtures_folder = File.join(RAILS_ROOT, ''test'', ''fixtures'') fixtures = Dir[File.join(fixtures_folder, ''*.yml'')].map {|f| File.basename(f, ''.yml'') } fixtures << Dir[File.join(fixtures_folder, ''*.csv'')].map {|f| File.basename(f, ''.csv'') } # If your fixture files are named differently from the classes they refer to, # you also need to do this: # # class_table_mappings = {:table_name_in_db => class_name} # Fixtures.create_fixtures(fixtures_folder, fixtures, class_table_mappings) # # otherwise: # This will populate the test database tables Fixtures.create_fixtures(fixtures_folder, fixtures) # The following will define methods that can access symbolic fixture names, # as in users(:bob) World do |world| (class << world; self; end).class_eval do @@fixture_cache = {} fixtures.each do |table_name| table_name = table_name.to_s.tr(''.'', ''_'') define_method(table_name) do |*fixture_symbols| @@fixture_cache[table_name] ||= {} instances = fixture_symbols.map do |fixture_symbol| if fix = Fixtures.cached_fixtures(ActiveRecord::Base.connection, table_name)[fixture_symbol.to_s] @@fixture_cache[table_name][fixture_symbol] ||= fix.find # find model.find''s the instance else raise StandardError, "No fixture with name ''#{fixture_symbol}'' found for table ''#{table_name}''" end end instances.size == 1 ? instances.first : instances end end end world end -- Posted via http://www.ruby-forum.com/.
I''ve updated http://wiki.github.com/aslakhellesoy/cucumber/fixtures accordingly. -- Posted via http://www.ruby-forum.com/.
The method I posted last week only works for Cucumber prior to 0.2.3.2.
For 0.2.3.2 and later, you cannot pass a block to the World more than
once, and thus the new way would be (in env.rb):
module FixtureAccess
def self.included(base)
(class << base; self; end).class_eval do
@@fixture_cache = {}
fixtures.each do |table_name|
table_name = table_name.to_s.tr(''.'',
''_'')
define_method(table_name) do |*fixture_symbols|
@@fixture_cache[table_name] ||= {}
instances = fixture_symbols.map do |fixture_symbol|
if fix =
Fixtures.cached_fixtures(ActiveRecord::Base.connection,
table_name)[fixture_symbol.to_s]
@@fixture_cache[table_name][fixture_symbol] ||= fix.find
# find model.find''s the instance
else
raise StandardError, "No fixture with name
''#{fixture_symbol}'' found for table
''#{table_name}''"
end
end
instances.size == 1 ? instances.first : instances
end
end
end
end
end
... then ...
World(FixtureAccess)
--
Posted via http://www.ruby-forum.com/.
This still wasn''t fully working; I posted too soon. See here for the final and working version: http://wiki.github.com/aslakhellesoy/cucumber/fixtures -- Posted via http://www.ruby-forum.com/.
Yi Wen wrote:> I do this: > > Fixtures.reset_cache > fixtures_folder = File.join(RAILS_ROOT, ''test'', ''fixtures'') > fixtures = Dir[File.join(fixtures_folder, ''*.yml'')].map {|f| > File.basename(f, ''.yml'') } > fixture_class_names = {} # or whatever needed > Fixtures.create_fixtures(fixtures_folder, fixtures, fixture_class_names)Sure, that''ll load fixtures and let you access them, e.g. with: User.find(1) What I wanted is to be able to access fixtures with: users(:john) Hence all the heavy lifting. It works now as described on the github wiki page. -- Posted via http://www.ruby-forum.com/.