Support of accepting object instead passing symbol of type of object
IlkhamGaysin opened this issue · 2 comments
For example we have
fill_form(:user, user_attributes)
and this is used in one spec file.
Lets image we have two or three registration forms through devise or any other authentication plugins and in our system we have two registrable resources for example admins and users or three admins, users, members.
So then instead writing this line
fill_form(:user/:admin/:member, user/admin/member_attributes)
in each scenario for per resource I want to declare it once on my shared_example(https://www.relishapp.com/rspec/rspec-core/docs/example-groups/shared-examples) file for example
fill_form(resource, resource_attributes)
By standard way for this purposes I need to create
let(:resource_name) { admin/member/user.class.name.downcase.to_sym }
and pass it to this
fill_form(resource_name, resource_attributes)
Is it possible to add this or it's overhead?
Hi there,
I'm not actually sure what you're asking for here. Scenic doesn't have anything to do with rspec helper methods you're referring to.
It would be clearest in your tests to spell out the resource you're filling. Looking at a line like fill_form(resource_name, resource_attributes)
seems to me like it doesn't tell you what's happening, whereas fill_form(:member, attributes_for(:member))
makes it fairly clear what's happening.
But what about DRY? @calebthompson
In case of password reset we have three resources and tests for password reset would be look the same with differences in expectations in the end of spec.
Here some examples:
require "rails_helper"
feature "Password Reset for Admin" do
let!(:resource) { create :admin }
let(:resource_name) { resource.class.name.downcase.to_sym }
let(:attributes_for_resource) { attributes_for :admin }
background do
visit sign_in_path
end
scenario "Admin resets his password" do
click_link "Forgot password?"
fill_form(resource_name, email: resource.email)
click_button "Send"
open_email(resource.email)
visit_in_email("Change my password")
fill_form(resource_name, :edit, attributes_for_resource.slice(:password, :password_confirmation))
click_button "Update password"
expect(current_path).to eq admin_root_path
end
end
And tests for member/user would be the same except titles and expectations in the end
expect(current_path).to eq admin/member/user_root_path
To eliminate duplication I've separated test actions into the shared_context and spelled in the each scenarios for member/admin/user resource_name
, attributes_for_resource
It's about passing an object instead a symbol.
For example it would be a good style to spell this one fill_form(member, attributes)
where member
and attributes
are variables in the test case.
Thanks!