Это простой вопрос, просто я все еще думаю о синтаксисе и методологии RSpec ... поэтому я немного запутался. Пожалуйста, потерпите меня ... Мне интересно, как подойти к тестированию контроллеров (и запросов и т. Д.), Когда задействован Cancan и пользователи могут иметь разные уровни авторизации.
Я читал, что одним из преимуществ Cancan является то, что он поддерживает всю аутентификацию в одной модели ... здорово! но, похоже, это сбило меня с толку ... так что я ищу совет.
Предыстория: я использую битовую маску для удержания уровня авторизации для пользователя (а-ля Railscast # 189 ). Таким образом, целочисленный столбец roles_mask
будет содержать все данные для пользователя. Не уверен, что это имеет значение, но теперь вы знаете.
Я бы хотел провести несколько тестов в качестве гостя, которые должны завершиться неудачей, если гость попытается создать сообщение. Но затем в том же posts_controller_spec
я хотел бы проверить, что admin
и moderator
могут создавать один и тот же пост. Просто не знаю, как лучше это настроить.
Итак, я должен иметь фабрику для гостевого пользователя, одну для администратора и т. Д. Перемещение @user.roles_mask = 1
в блок описания до того, как спецификации, которые я хочу для "администратора", не работает. Нет ошибок метода. Но, если я назначу role_mask на Фабрике, она работает?!? Итак, как я могу проверить разные уровни role_mask? (ноль, 0, 1, 2, 4 и т. д.)
describe PostsController do
before(:each) do
@user = Factory(:user)
session[:user_id] = @user.id
@attr = Factory.attributes_for(:post)
end
describe "GET index" do
it "assigns all posts as @posts" do
post = @user.posts.create(@attr)
get :index
assigns(:posts).should eq([post])
end
end
...
describe "POST create" do
describe "with valid params" do
it "creates a new Post" do
expect {
post :create, :post => @attr
}.to change(Post, :count).by(1)
end
...
end
# posts_controller.rb
class PostsController < ApplicationController
before_filter :login_required, :except => [:index, :show]
load_and_authorize_resource
...
end
Factory:
Factory.define :user do |user|
user.sequence(:email) { |n| "foo#{n}@dummycorp.com" }
user.password "foobar"
user.password_confirmation { |u| u.password }
user.firstname "foo"
user.roles_mask 1 # < --- remove & tests fail
# < --- how to manipulate dynamically in tests
end