Skip to content

GitLab

  • Menu
Projects Groups Snippets
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
  • C chouette-core-tmp
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Incidents
  • Packages & Registries
    • Packages & Registries
    • Infrastructure Registry
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Administrator
  • chouette-core-tmp
  • Wiki
  • Rails spec

Last edited by Teddy Wing Apr 03, 2018
Page history
This is an old version of this page. You can view the most recent version or browse the history.

Rails spec

Ecriture de fichier spec

Spec de Model

Spec de View

Helpers

  • matcher have_link_for_each_item qui 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 (dans spec/support/integration_spec_helper.rb).
  • matcher have_the_right_number_of_links qui 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 (dans spec/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 (dans spec/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 (dans spec/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_user pour 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
Clone repository
  • Class Diagram
  • Data Models
  • Home
  • Optional Features
  • Rails Controller
  • Rails I18n
  • Rails migrations
  • Rails models
  • Rails spec
  • Rails views
  • Seed database