Railsers:
This simple test shows assert_latest{} in action:
c1, c2 = assert_latest Chat do
Chat.create(:user => aaron, :utterance =>
''foo'')
Chat.create(:user => becky, :utterance =>
''bar'')
end
assert{ c1.utterance == ''foo'' }
assert{ c2.utterance == ''bar'' }
assert_latest{} sampled the maximum Chat id before yielding to its block. Then
it returned any records found with an id greater than that maximum. This helps
us write more elaborate production code, which might not return its new objects
to its callers.
This blog describes assert_latest''s rationale and original
functionality:
http://www.oreillynet.com/onlamp/blog/2007/07/assert_latest_and_greatest.html
The latest and greatest version of assert_latest{} contains some new features.
Firstly, the assertion now takes any number of model types. That prevents this
icky situation:
chat = nil
prop = assert_latest Prop do
chat = assert_latest Chat do
production_code_that_props_and_chats()
end
end
assert{ chat.user == prop.user }
The nested blocks interfered with chat''s scope, forcing un-Ruby-like
contortions
when you need to compare the two returned objects. And assert_latest{} is not
DRY - it appears twice!
To reduce duplication, you may now pass both models into one assert_latest call.
You can also drop in a diagnostic string:
p, c = assert_latest Prop, Chat, ''diagnostic'' do
Prop.create(:name => ''foo'', :price => 42)
Chat.create(:user => aaron, :utterance =>
''bar'')
end
assert{ p.name == ''foo'' }
assert{ c.utterance == ''bar'' }
The returned objects can be individual items, or arrays of returned items:
p, cz = assert_latest Prop, Chat do
Prop.create(:name => ''foo'', :price => 42)
Chat.create(:user => aaron, :utterance =>
''foo'')
Chat.create(:user => aaron, :utterance =>
''bar'')
end
assert{ p.name == ''foo'' }
assert{ cz.first.utterance == ''foo'' }
assert{ cz. last.utterance == ''bar'' }
Ruby lets you unroll those returned arrays. This allows you to check your
returned count implicitly:
p, (c1, c2) = assert_latest Prop, Chat do
...
I added assert_latest{} (and its evil twin, deny_latest{}) to the
assert_efficient_sql package, because they both require ActiveRecord. Get them
all, on the usual channels, with Piston:
piston import svn://rubyforge.org/var/svn/efficient-sql/ \
vendor/plugins/efficient-sql
Oh, one more feature. When assert_latest fails, it reflects its called
block''s
source into its diagnostic. That requires the RubyReflector module that
assert{ 2.0 } uses, so you will need that too:
gem install assert2
--
Phlip
http://assert2.rubyforge.org/
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---