On Jun 29, 2011, at 12:21 PM, S Ahmed wrote:
> My method looks like:
>
> def self.can_do_this(user)
> return false if user.nil?
> ( (Time.now >= user.created_at) ? true : false )
> end
>
> my spec:
>
> it "should allow you to do this" do
> user = stub("user")
> user.stub(:nil?).and_return(false)
> user.stub(:created_at).and_return(Time.now)
>
> res = User.can_do_this(user)
> res.should == true
> end
>
> Running the spec I get:
>
> Failer/Error: res = User.can_do_this(user)
> Stub "user" received unexpected message :created_at with (no args)
>
> Any ideas?
I copied what you have as/is and added the User class and example group
declarations:
class User
def self.can_do_this(user)
return false if user.nil?
( (Time.now >= user.created_at) ? true : false )
end
end
describe User do
it "should allow you to do this" do
user = stub("user")
user.stub(:nil?).and_return(false)
user.stub(:created_at).and_return(Time.now)
res = User.can_do_this(user)
res.should == true
end
end
This passes, so either something is different about our environments or there
is more going on than you are showing us. Please copy what I wrote above into
its own file and run it and let us know if it passes or fails.
Off topic, some recommendations about the Ruby in your example:
1. user.stub(:nil?).and_return(false) is unnecessary. It is an object and it
will return false to nil?.
2. you can declare a method stub in the declaration of the stub object:
user = stub("user", :created_at => Time.now)
3. Asking an object if it is nil is unnecessary noise AND an unnecessary method
call. This would be more terse and faster (as the evaluation happens in C in
MRI, Java in JRuby, etc):
return false unless user
4. A ternary that returns true or false is redundant. These two expressions are
functionally equivalent:
(Time.now >= user.created_at) ? true : false
Time.now >= user.created_at
5. Given #3 and #4, the implementation of can_do_this can be reduced to:
user && Time.now >= user.created_at
With those recommendations, the whole example can be reduced to:
class User
def self.can_do_this(user)
user && Time.now >= user.created_at
end
end
describe User do
it "should allow you to do this" do
user = stub("user", :created_at => Time.now)
User.can_do_this(user).should be_true
end
end
We could talk about can_do_this wanting a "?" at the end, but my suspicion is
that is not the real example you are working from.
HTH,
David
_______________________________________________
rspec-users mailing list
[email protected]
http://rubyforge.org/mailman/listinfo/rspec-users