Frage

Ich habe einige Tests nachträglich schriftlich, mit RSpec, für ein Rails-Projekt.

Ich bin mit dem CanCan gem Zulassung zur Verfügung zu stellen. Ich beschloss, eine Spezifikation zu schreiben, die das ability.rb Modell testen. Ich ging dann auf meine restlichen Modelle zu testen.

Ich habe auf Controller bewegt, und ich habe in einen riesigen Haken laufen: Ich teste meine Fähigkeiten wieder von vorn

Im Grunde genommen habe ich eine Reihe von Modellen Stub und Stummel aus ihren Verbänden; ansonsten wird die Antwort nur wieder 403 Forbidden.
Der Grund dafür ist, dass der Controller ist grundsätzlich verantwortlich für sich Gedanken über die Zulassung.

Ich bin mir nicht ganz sicher, wo man von hier geht. Ich stubbing bis zu 6 Modellen aus, nur einen einzigen Test zu schreiben. I wissen die Fähigkeiten der Arbeit, das ist, was ability_spec.rb ist.

Also diese Frage ist wirklich 2-fach:

  1. Sollte ich separat die Fähigkeit Modell testen?
  2. Should prüft die Steuerung mit den entsprechenden Berechtigungen betroffen sein?

Bearbeiten     require 'spec_helper'     Devise umfassen :: TestHelpers # Spec-Zugriff auf Helfer geben

describe TokensController do
  before(:each) do
    @mock_user = User.new(:username => "bob", :email => "user@user.com", :password => "longpassword")
    @mock_user.role = "admin"
    sign_in @mock_user
    #Ability.stub!('can').and_return(true)
  end
  it "should let me see grids/:g_id/tokens index" do
    test_grid = mock_model(Grid)
    test_token = mock_model(Token)
    Grid.stub!(:find).and_return(test_grid)
    Token.stub!(:find).and_return(test_token)
    get 'index'

    a1 = Ability.new(@mock_user)
    a1.can?(:index, Token).should be_true # This line works fine; as it should
    puts response.status #This returns 403, which means CanCan::AccessDenied was raised
  end
end

Danke,
Robbie

War es hilfreich?

Lösung

ich tun Test des Cancan Modell separat, sondern testen, was es unter welchen Bedingungen ermöglichen.

Ich denke, wenn Sie tun Dinge wie

authorize! :take_over, @the_world

Dann glaube ich, sollten Sie in der Steuerung, dass testen. Ich bin nicht sicher, müssen Sie allerdings alle 6 Versionen Ihrer Modelle testen.

Sie können die Ability.can Stub? Klasse und hat es wahr / falsch reagieren, und Test, wie Sie Ihren Controller Griff, wenn sie (und was noch wichtiger ist), wenn es nicht fortgesetzt werden kann.

Andere Tipps

Nicht sicher, ob dies für Sie zu spät ist, aber ich lief nur in das gleiche Problem und löste es das folgende Codebeispiel verwenden -

before do
  @user = Factory.create(:user)
    sign_in @user

    @abilities = Ability.new(@user)
    Ability.stub(:new).and_return(@abilities)
  end
end

Ich habe neue Fähigkeit # stubbed heraus, mir einen Verweis auf die Instanz der Fähigkeit zu geben, dass die Kontrollen der aktuelle Benutzer. Dann kann ich Stub spezifischen Fähigkeiten wie folgt aus:

@abilities.stub!(:can?).with(:destroy, regatta).and_return(true)

oder Admin-Rechte geben:

@abilities.stub!(:can?).and_return(false)

ähnlich wie Sams Antwort, aber von dem CanCan Wiki-Seite auf Prüfung:

Controller Testing

Wenn Sie auf Controller-Ebene zu Testautorisierungsfunktionalität wollen eine Option zur Anmeldung in dem Benutzer, der über die entsprechenden Berechtigungen hat.

user = User.create!(:admin => true) # I recommend a factory for this
# log in user however you like, alternatively stub `current_user` method
session[:user_id] = user.id 
get :index
assert_template :index # render the template since he should have access

Wenn Sie alternativ das Reglerverhalten unabhängig von testen wollen, was in der Fähigkeit, Klasse, es ist einfach zu Stummel aus der Fähigkeit, mit jedem von Ihnen gewünschten Verhalten.

def setup
  @ability = Object.new
  @ability.extend(CanCan::Ability)
  @controller.stubs(:current_ability).returns(@ability)
end

test "render index if have read ability on project" do
  @ability.can :read, Project
  get :index
  assert_template :index
end

Wenn Sie sehr komplexe Berechtigungen kann es zu viele Verzweigungsmöglichkeiten führen. Wenn diese alle in der Steuerungsschicht getestet werden, dann kann es zu langsam und aufgeblähten Tests führen. Stattdessen Controller Genehmigung Ich empfehle halte Tests Licht und die Prüfung die Zulassung Funktionalität gründlicher in der Fähigkeit, Modell durch Tests Einheit wie an der Spitze gezeigt.

ich denke, Genehmigung getan werden muss, vor allem für die Controller , um sicherzustellen, dass Ihre Berechtigung ordnungsgemäß funktioniert mit Ihrem Controller. So machen es DRY können Sie Ihre eigene matcher implementieren können wie diese

verwendet werden
let!(:user) {create :user}
before { login_user_request user}

it "grants admin access to show action" do
  expect{ get :show, {id: user.id} }.to be_authorized
end
it "denies user access to edit action" do
  expect{ get :edit, {id: user.id} }.to be_un_authorized
end

und implementieren dann diese Matcher mit Ihrem eigenen Weg zu testen, wie eine Anforderung bewilligt wird oder nicht

RSpec::Matchers.define :be_authorized do
  match do |block|
    block.call
    expect(response).to be_success
  end

  def supports_block_expectations?
    true
  end
end

RSpec::Matchers.define :be_un_authorized do
  match do |block|
    expect{
      block.call
    }.to raise_error(Pundit::NotAuthorizedError)
  end

  def supports_block_expectations?
    true
  end
end

Warum gehst du nicht ein

can :manage, :all do
  user.is_ultrasuper == 1
end

in Ihrer Fähigkeit und dann eine is_ultrasuper param in einem Ihrer Leuchte Benutzer haben:

one: 
  id: 1 
  username: my_username 
  is_ultrasuper: 1

Melden Sie sich dann den Benutzer in bei der Einrichtung Ihrer Tests. Diese in Tests sollten Sie in der Lage sein, überhaupt etwas zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top