how to test models and methods which define in models - ruby-on-rails-3

please tell me what is the main thing to test the models with rspec, I am testing only validations part like email and password etc and it is necessary to test the methods which is defined in model.
thank you

If you are only testing validations, you should use this:
https://github.com/thoughtbot/shoulda-matchers
If you want to test methods (any method, not just validation methods), you'll have to evaluate each response possibility according to what you defined as its behaviour.
describe "semaphore" do
describe "#turn_green" do
it "should turn green" do
subject.turn_green.should == "green"
end
it "should not turn red" do
subject.turn_green.should_not == "red"
end
end
end

Related

Rails 5 after removal of assigns function for controller tests

I used assert_template and assigns extensively before Rails 5 in my controllers tests. For example to test that a link in the view is correct:
assert_select ".left-off-canvas-menu ul li a[href=?]", event_all_items_path(assigns(:event)), "Back to all items"
I figured that assert_template was not difficult to get rid of.
However, I don't know how to replace test cases like the one above.
I know about the gem to include those functions, but I'd like to try without them. So alternatives would be:
Would you make a case to keep the assigns function or would you say it is meant to be hard coded?

rails user input with <script>, stored, and displayed

I have an application that collect user input and store to DB and show back to user.
One user entered "alert(1)" into the name field and saved it into DB.
Whenever the name is displayed, the page will be broken.
I know how to fix that input only with validation for input, and h() for output.
However, I have so many input fields and so many outputs that accept users' text.
Is there any simple way to prevent this happening(i.e. overriding params method, etc)?
I also want to know how you expert guys are dealing with this problem?
As of Rails 3, my understanding was that embedded ruby code was html escaped by default. You don't need to use h() to make it that way. That is, if you use <%= "<script>a=1/0;</script>" %> in a view, the string is going to be made html safe, and so the script doesn't execute. You would have to specifically use raw() or something similar to avoid it - which you should naturally not do unless you're really confident about the contents.
For output, Rails 3 automatically html-encode all text unless I use raw() method.
For input, How about making a common validator and apply to all fields that are text or string? Is it desirable?
http://api.rubyonrails.org/classes/ActiveModel/Validator.html
class MyValidator < ActiveModel::Validator
def validate(record)
record.class.columns.each do |c|
if c.type==:text || c.type == :string
record.errors.add c.type, "script tag is not allowed" if c[/<script[^>]*>/]
end
end
end
end

Using RSpec, how can I test that a method is called with instance of a class but with specific values on specific attributes?

I want to write a test like the following:
account = Account.find(1)
#controller.should_receive(:authorize!).with(:create, instance_of(User, :account_id => account.id))
(exact example on testing the cancan gem on a controller of mine)
I know that the part :account_id => account.id is invalid.
My question goes here:
How can I call the instance_of but at the same time test the attributes of the instance to have specific values?
I hope that this is clear. Otherwise, let me know, how can I make it more clear.
Thanks in advance
Panayotis
What are you trying to test? That the controller loads the proper instance and the passes the proper instance to :authorize!? If yes, then something like :
Account.should_receive(:find).returns(account))
#controller.should_receive(:authorize!).with(account)
would do the job
You may use a block for more control on the expected arguments, more info:
Argument matchers
To expand on the accepted answer, it is possible to use argument matchers to do the following:
expect(controller).to receive(:authorize!).with do |symbol, received_user|
expect(symbol).to eq :create
expect(received_user).to be_a User
expect(received_user.account).to eq account
end

How do we test a Rails Model which does not have an equivalent table in the backend using RSpec

I have a Moderator model which basically queries web site related stat results from other models.
An e.g. of displayed stats could be the total number of users belonging to a particular area out of many areas in a city. Limiting the number of such records to a fixed number. For this, the body defined within the Moderator model makes use of an Area model.
Since the queries are not using anything from the same model, but actually from other models, there wasn't a need for me to have a table migration wrt this model.
I basically am now trying to test the defined methods in the Moderator model using Rspec.
What I am basically trying to test is that a call to the method should return success, this I am doing through:-
subject.send(:method_name)
response.should be_success
I'm getting a common error for all such defined methods saying that database_name.table_name does not exist. Well , this is true but how should is it really making a difference?, and how to get a work around for this to just test a simple use case of calling a method successfully in the above context.
Thanks.
Try something like this
describe Moderator do
it "should do something" do
moderator = Moderator.new
moderator.something.should == "do"
end
end
This assumes that you have a method something on Moderator and that it returns the string "do".
I think the RSpec Book provides great information and examples if you want to get more in-depth with your rspec.
Well,
The below line code did work for me:-
Model_name.method_name.should_not be_nil

Rails 3 Custom Validation against DB-Entries

I have currently a website which lets every user register, but I want to give out codes, so that only users with a special code can register. I already worked with validation, but I really need your help for doing this.
At first, I have my form which lets the user register and where the user can input the code.
Then I have the User Model, which should containt the validation checks:
validates :registration_codes, :presence => true, ??? => ???
I can get my reg_codes in any form, because I haven't created them yet. Maybe I will just update them manually and hardcode or maybe I will make a model. I don't know. So, what I just need is the validation check which should do something like this:
:registration_code should be code1 or code2 or code3
I have even tried to make a custom method, but I didn't find out how to forward the form input to my method.
Thanks for any help!
I wrote an custom method, which I call by:
validate :validate_regcode
And then I just search in the DB for the code and check if the result is empty:
def validate_regcode
regcode_feed = Code.where("regcode = ?", regcode)
if regcode_feed.empty?
errors.add(:regcode, "Ihr Registrierungscode ist leider ungültig.")
end
end
So, at all, it's really simple if you know the way to do it. Maybe there's something even simpler, but I like my way :)