Ecriture de fichier spec
Spec de Model
Spec de View
Helpers
-
matcher
have_link_for_each_itemqui permet d'itérer sur tous les éléments d'une collection, et de vérifier - pour chacun - qu'on a un lien vers l'URL désirée (dansspec/support/integration_spec_helper.rb). -
matcher
have_the_right_number_of_linksqui permet d'itérer sur tous les éléments d'une collection, et de vérifier - pour chacun - qu'on a le bon nombre de liens (dansspec/support/integration_spec_helper.rb). -
with_permission permission_name do ...qui permet de tester le rendu avec un utilisateur disposant de la permission désirée (dansspec/support/integration_spec_helper.rb). -
build_paginated_collection(:factory_name, decorator_class, factory_options, context: decorator_context)permet de construire une collection d'objets et de les décorer, de façon similaire à ce que ferait un controlleur (dansspec/support/integration_spec_helper.rb.
Tips
- pour nester la vue, par exemple émuler une URL
/parents/:parent_id/objects:controller.request.path_parameters[:parent_id] = parent.id
Exemple
Pour une vue d'index, dans laquelle on veut vérifier:
- le nombre de lignes du tableau
- la présence de lien pour chaque ligne (en fonction des permissions)
require 'spec_helper'
describe "/objects/index", :type => :view do
let(:parent) { assign :parent, create(:parent) }
let(:context) {
{
foo: bar,
bar: baz
}
}
let(:objects) do
assign :objects, build_paginated_collection(:object, ObjectDecorator, parent: parent, context: context)
end
before :each do
allow(view).to receive(:collection).and_return(objects)
allow(view).to receive(:current_referential).and_return(parent)
controller.request.path_parameters[:parent_id] = parent.id
render
end
common_items = ->{
it { should have_link_for_each_item(objects, "show", -> (object){ view.parent_object_path(parent, object) }) }
it { should have_link_for_each_item(objects, "foo", -> (object){ view.parent_foo_path(parent, object.foo) }) }
it { should have_link_for_each_item(objects, "bar", -> (object){ view.parent_bar_path(parent, object.bar) }) }
}
common_items.call()
it { should have_the_right_number_of_links(objects, 3) }
with_permission "objects.activate" do
common_items.call()
it { should have_link_for_each_item(objects, "activate", -> (object){ view.activate_parent_object_path(parent, object) }) }
it { should have_the_right_number_of_links(objects, 4) }
end
end
Spec de Controller
Helpers
-
login_userpour créer un utilisateur et le passer dans la session -
with_permission permission do ...pour ajouter la permission à l'utilisateur connecté dans le contexte
Exemple
RSpec.describe ObjectController, :type => :controller do
login_user
let(:parent) { create :parent }
let(:object) { create :object, parent: parent }
describe 'PUT deactivate' do
let(:request){ put :deactivate, id: object.id, parent_id: parent.id }
it 'should redirect to 403' do
expect(request).to redirect_to "/403"
end
with_permission "foo.bar" do
it 'returns HTTP success' do
expect(request).to redirect_to [parent, object]
expect(object.reload).to be_deactivated
end
end
end
describe 'PUT activate' do
let(:request){ put :activate, id: object.id, parent_id: parent.id }
before(:each){
object.deactivate!
}
it 'should redirect to 403' do
expect(request).to redirect_to "/403"
end
with_permission "objects.change_status" do
it 'returns HTTP success' do
expect(request).to redirect_to [parent, object]
expect(object.reload).to be_activated
end
end
end
end