Написание спецификаций для разрешений CanCan - PullRequest
3 голосов
/ 28 июля 2011

Я новичок в rpsec w Rails 3 .... Я только что добавил CanCan для разрешений в своем приложении Rails 3. Я хочу добавить контрольные примеры в rspec, но я не уверен на 100%, где они должны жить.

Если я хочу написать тесты, чтобы проверить разрешения. Должны ли они быть в контроллере? Модель? Где-то еще?

Что-то вроде:

@user1 = belongs to @group
@user2 does not


@user1.should be_able_to(:destroy, @group.new(:user => user))
@user2. should_not be_able_to(:destroy, @group.new(:user => user))

Спасибо

Ответы [ 2 ]

3 голосов
/ 28 июля 2011

Я не думаю, что такие тесты должны принадлежать модели, потому что я не хочу, чтобы объекты модели должны были знать о пользовательских сессиях. Я бы предпочел обработать эту логику в контроллерах.

Кроме того, вы можете создать параметр powers_spec для тестирования вашей конфигурации cancan, которая не доказывает, что определенные вами правила авторизации действительно используются. Вы можете легко настроить cancan, чтобы запретить действие, никогда не проверять авторизацию перед выполнением этой операции и в конечном итоге игнорировать свои собственные правила. В результате я предпочитаю тестировать поведение контроллеров как в авторизованных, так и в несанкционированных ситуациях, а не тестировать реализацию моих правил авторизации.

3 голосов
/ 28 июля 2011

Хороший вопрос, я думаю, они должны находиться в папке спецификаций модели или даже добавляться как блок описания для модели, которую вы тестируете.Что-то вроде

# in user_spec.rb
describe "user abilities" do
  let(:group) { Factory(:group) }
  let(:user) { Factory(:user, :group => group) }

  it "should be able to destroy his group" do
    user.should be_able_to(:destroy, group)
  end

  it "should not be able to destroy other groups" do
    Factory(:user).should_not be_able_to(:destroy, group)
  end

  # if be_able_to macro define its error message
  # you could also do this kind of specs with
  # automatic failure message and spec descriptions
  subject { Factory(:user) }

  it { should be_able_to(:destroy, subject.group) }

end

Поскольку вы задаете пользовательские способности, я думаю, user_spec.rb - лучшее место для их хранения.

...