Mocha : How do you set up an expectation for an instance method?
Asked Answered
D

2

6

Assume this ruby code:

class User
  def self.failed_login!(email)
    user = User.find_by_email(email)
    if user
      user.failed_login_count = user.failed_login_count + 1
      user.save
    end
  end
end

I want to write a test that tests that user.save is never called when an invalid email is given. E.g.:

it "should not increment failed login count" do
   User.expects(:save).never()
   User.failed_login!("doesnotexist")
end

This test currently passes, but it also passes when I provide a valid email address.

How do I set up the expectation using Mocha? (or any other mocking framework) such that it tests the save method of any User instance is never called?

(preferably without stubbing/mocking the find_by_email method, as the implementation of how to get the user might change in the future)

Cheers

Disagreement answered 27/5, 2009 at 5:9 Comment(0)
D
23

For others that might have stumbled unto this, I found the answer in another post that was dealing with RR as the mocking framework... in Mocha you can do this:

User.any_instance.expects(:save).never()
Disagreement answered 27/5, 2009 at 6:59 Comment(1)
Just beware running this with RSpec mocks, since it'll affect all following instances. Mocha pulls the mock down as expected, per spec.Halfblooded
P
4

alternatively you could do something like

user = mock
User.expects(:find).returns user
user.expects(:save).never
Pasteurize answered 28/5, 2009 at 19:12 Comment(1)
The User.expects(:find) would probably be better as User.stubs(:find) in this case, because we don't really care whether User.find is called - just that User#save is not called.Fain

© 2022 - 2024 — McMap. All rights reserved.