BrianWilson
BrianWilson

Reputation: 1703

Rspec test of private model method in rails app

I have a private model method in my rails app that is so vital to quality of life as we know it that I want to test it using rspec so that it squawks if future tampering changes how it works.

class MyModel < ApplicationRecord
    belongs_to something
    has_many somethings

    after_create :my_vital_method

    validates :stuff

    private
    def my_vital_method
        #do stuff
    end
end

When I try calling the method in an rspec test I get the following error message:

NoMethodError: undefined method `my_vital_method' for #< Class:......>

Question: How do I call a private model method in rspec?

Upvotes: 0

Views: 1055

Answers (2)

diabolist
diabolist

Reputation: 4099

If your private method needs testing it probably should be a public method of another class. If you find the name of this class define its purpose and then create the method signature you want you would end up with something like

def my_vital_method
  MyVitalClass.new.do_stuff
end

and now you can write a spec for do_stuff.

Upvotes: 0

Brendon Whateley
Brendon Whateley

Reputation: 1453

By definition, you are not allowed to call private methods from outside of the class because they are private.

Fortunately for you, you can do what you want if you use object.send(:my_vital_method) which skips the testing for method call restrictions.

Now, the bigger issue is that you really are making your object more brittle, because calling from outside like that may need implementation details that will get out of sync with the class over time. You are effectively increasing the Object API.

Finally, if you are trying to prevent tampering, then you are tilting at windmills -- you can't in Ruby because I can just trivially redefine your method and ensure that if my new method is called from your anti-tamper checking code, I call the original version, else I do my nefarious stuff.

Good luck.

Upvotes: 1

Related Questions