I just use a factory method.
describe 'Authorize.net CIM gateway', :shared => true do
describe 'saving a card' do
describe 'preconditions' do
it "should raise an error if the card is not saved" do
lambda {
gateway.save_credit_card(Factory.build(:credit_card, :user =>
Factory(:user)))
}.should raise_error(ArgumentError, /unsaved record/)
end
end
describe 'first card saved on an account' do
it "should set the authorize_id on the credit card" do
credit_card = Factory :credit_card, :user => Factory(:user)
gateway.save_credit_card credit_card
credit_card.authorize_id.should be_present
end
it "should return true for a successful response" do
credit_card = Factory :credit_card, :user => Factory(:user)
gateway.save_credit_card(credit_card).should be_true
end
it "should mark the card as having a validated card code" do
card = Factory :credit_card, :card_code_validated => false
gateway.save_credit_card card
card.should be_card_code_validated
end
end
# etc etc etc etc
end
end
describe Payment::AuthorizeNetCim::FakeGateway do
def gateway
@gateway ||= Payment::AuthorizeNetCim::FakeGateway.new
end
it_should_behave_like 'Authorize.net CIM gateway'
# some extra custom examples
end
I prefer this to requiring an instance variable, because you get built in
error-handling for free. If you don't implement the factory method, you get
"undefined method: gateway" rather than the less obvious undefined method on
NilClass error.
Also, your :locals => { :entry => Entry.new } syntax is going to be no good
because you'll only have one instance of Entry that gets reused across
examples. No bueno. You'd have to do
:locals => lambda { { :entry => Entry.new } }
and now it's just getting ugly.
If you think defining methods is too heavy (which I wouldn't agree with, but
okay) then maybe use the let method?
describe Entry do
before do
let(:entry) { Entry.new )
end
it_should_behave_like "an_entry"
end
How's that look?
Pat
On Feb 23, 2010, at 9:30 AM, Scott Taylor wrote:
>
> Has there been any development on shared helpers / it_should_behave_like
> feature in rspec?
>
> I forget the reasons, but I remember a patch for something like this was
> rejected:
>
> it_should_behave_like "an_entry", :locals => { :entry => Entry.new }
>
> OR:
>
> before do
> @entry = Entry.new
> end
>
> it_should_behave_like "an_entry", :locals => lambda {
> {
> :entry => @entry
> }
> }
>
> Is there any code which now deals with the variable passing issue in rspec?
>
> Best,
>
> Scott
>
> _______________________________________________
> rspec-users mailing list
> [email protected]
> http://rubyforge.org/mailman/listinfo/rspec-users
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users