Ruby on rails Rails 3.1、RSpec和Authlogic的问题
我是Rails开发的新手——我读了很多书,现在正全神贯注于headfirst。我有一个使用用户模型建立的基本应用程序,以及通过Authlogic建立的用户会话。我正在用RSpec测试 昨天早些时候,我的所有测试都通过了(有点像,见下文),然后实现了密码重置功能(通过电子邮件、HTTP),现在我的大部分测试都失败了——似乎是登录/Authlogic的问题 我在上面提到的是,自从启动以来,我的测试中一直存在Authlogic问题。。。它似乎不想登录。在请求规范中(也许这最好在单独的问题中解决),我无法登录(通过访问登录路径和填写字段),除非我在该规范中手动注册用户(注册路径、填写等)。工厂似乎没有做到这一点。。。我所看到的每一个地方都说要做@user=Factory.create(:user)然后是UserSession.create(@user),但对我来说,它往往会失败。有时我可以使用spec_helper方法(sign_in(@user))登录,有时则失败 我应该注意到,不管我的测试说了什么,一切都在开发模式下工作。阅读关于TDD的文章首先让我对测试充满了热情,但这削弱了我的动力 无论如何。。。下面是一些相关代码。请告诉我还需要什么 典型错误:Ruby on rails Rails 3.1、RSpec和Authlogic的问题,ruby-on-rails,login,rspec,authorization,authlogic,Ruby On Rails,Login,Rspec,Authorization,Authlogic,我是Rails开发的新手——我读了很多书,现在正全神贯注于headfirst。我有一个使用用户模型建立的基本应用程序,以及通过Authlogic建立的用户会话。我正在用RSpec测试 昨天早些时候,我的所有测试都通过了(有点像,见下文),然后实现了密码重置功能(通过电子邮件、HTTP),现在我的大部分测试都失败了——似乎是登录/Authlogic的问题 我在上面提到的是,自从启动以来,我的测试中一直存在Authlogic问题。。。它似乎不想登录。在请求规范中(也许这最好在单独的问题中解决),我无
Failure/Error: response.should render_template('users/show')expecting <"users/show"> but rendering with <"users/new,>.....
6) UsersController GET index for non admin users should protect the page
Failure/Error: response.should redirect_to(root_path)
Expected response to be a redirect to <http://test.host/> but was a redirect to <http://test.host/user_sessions/new>
# ./spec/controllers/users_controller_spec.rb:72:in `block (4 levels) in <top (required)>'
11) UsersController POST 'create' success should redirect to the user show page
Failure/Error: response.should redirect_to(user_path(assigns(:user)))
Expected response to be a redirect to <http://test.host/users/5> but was a redirect to <http://test.host/>
# ./spec/controllers/users_controller_spec.rb:160:in `block (4 levels) in <top (required)>'
13) UsersController POST 'create' success should be logged in
Failure/Error: UserSession.find.should_not be_nil
expected: not nil
got: nil
用户控制器规范
require 'spec_helper'
describe UserSessionsController do
render_views
before(:each) do
@valid_user = Factory.create(:user)
activate_authlogic
end
describe "Authlogic & Application Controller tests" do
it "should allow login of a specified user, and logged_in? should provide correct response" do
sign_in(@valid_user)
UserSession.find.user.should == @valid_user
logged_in?.should be_true
logged_in?.email.should == @valid_user.email #logged_in function actually returns session
end
it "should allow logout of a specified user and logged_in? should provide correct response" do
sign_in(@valid_user)
logged_in?.should be_true
sign_out
logged_in?.should be_false
end
end # authlogic tests
describe "GET 'new'" do
it "should only get new if logged out" do
sign_in(@valid_user)
get :new
flash[:error].should =~ /You must be logged out/i
response.should redirect_to user_path(@valid_user.id)
response.code.should == "302" # redirected by require_no_user
end
end # get new
describe "POST 'create'" do
it "should create user session" do
logged_in?.should be_false
post :create, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
logged_in?.should be_true
end
it "should redirect to user show page, with flash success" do
post :create, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
assigns[:user_session].user.should == @valid_user
response.code.should == "302"
response.should redirect_to(user_path(@valid_user.id))
flash[:success].should =~ /login succ/i
end
it "should not create user session for invalid password" do
logged_in?.should be_false
post :create, :user_session => { :email => @valid_user.email, :password => "" }
logged_in?.should be_false
end
it "should redirect back to login page on invalid params, show proper flash" do
post :create, :user_session => { :email => @valid_user.email, :password => "" }
response.should redirect_to new_user_session_path
## BROKEN BECAUSE OF BEFORE_FILTER ##
# response.should render_template('new')
#response.should have_selector("div.flash.error", :content => "Incorrect user")
flash[:error].should =~ /Incorrect user name or password/i
end
it "should only create if logged out" do
sign_in(@valid_user)
post :create, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
flash[:error].should =~ /You must be logged out/i
response.code.should == "302"
response.should redirect_to user_path(@valid_user.id)
end
end # post create
describe "DELETE destroy" do
it "should destroy user session if logged in" do
sign_in(@valid_user)
logged_in?.should be_true
delete :destroy
UserSession.find.should be_nil
response.should redirect_to new_user_session_path
end
it "should not destroy if logged out" do
logged_in?.should be_false
delete :destroy, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
flash[:error].should =~ /You must be logged in/i
response.code.should == "302"
response.should redirect_to new_user_session_path
end
it "should redirect to login page and show correct flash on logout" do
sign_in(@valid_user)
logged_in?.should be_true
delete :destroy
flash[:notice].should =~ /You have been logged/i
response.should redirect_to new_user_session_path
end
end # delete destroy
end # specs
require 'spec_helper'
describe UsersController do
render_views
before(:each) do
activate_authlogic
end
describe "GET 'new'" do
it "should only work if not logged in" do
user = Factory.create(:user)
sign_in(user)
get :new
flash[:error].should =~ /must be logged out/i
response.should redirect_to user_path(user)
end
end
describe "GET index" do
before(:each) do
@admin_user = Factory.create(:user, :admin => true)
@signed_in_user = Factory.create(:user)
@user1 = Factory.create(:user)
@user2 = Factory.create(:user)
@user3 = Factory.create(:user)
@users = [@admin_user, @signed_in_user, @user1, @user2, @user3]
end
describe "for non signed in users" do
it "should deny access" do
get :index
flash[:error].should =~ /must be logged in/i
response.should redirect_to new_user_session_path
end
end
describe "for non admin users" do
it "should protect the page" do
sign_in(@signed_in_user)
get :index
response.should redirect_to(root_path)
flash[:error].should be_nil
flash[:success].should be_nil
flash[:notice].should be_nil
end
end
describe "for admin users" do
before(:each) do
sign_in(@admin_user)
end
end
end
describe "POST 'create'" do
describe "failure" do
before(:each) do
@attr = {:name=>"", :email=>"", :password=>"", :password_confirmation=>""}
end
it "should not create a user" do
lambda do
post :create, :user => @attr
end.should_not change(User, :count)
end
it "should render the 'new' page" do
post :create, :user => @attr
response.should render_template('new')
response.should have_selector("div.error_messages")
end
it "should only create a user if not logged in" do
@another_user = Factory.create(:user)
sign_in(@another_user)
@valid_attr = { :name=> 'New User', :email => 'somemail@gmail.com',:password => 'foobar', :password_confirmation => 'foobar' }
post :create, :user => @attr
flash[:error].should =~ /must be logged out/i
response.should redirect_to user_path(@another_user)
end
end #failure
describe "success" do
before(:each) do
@attr = { :name=> 'New User', :email => 'somemail@gmail.com',:password => 'foobar', :password_confirmation => 'foobar' }
end
it "should create a user" do
lambda do
post :create, :user => @attr
end.should change(User, :count).by(1)
end
it "should redirect to the user show page" do
post :create, :user => @attr
assigns[:user].email.should == "somemail@gmail.com"
response.should redirect_to(user_path(assigns(:user)))
end
it "should have a welcome message" do
post :create, :user => @attr
flash[:success].should =~ /signed/i
end
it "should be logged in" do
post :create, :user => @attr
UserSession.find.should_not be_nil
end
end #success
end # post create
describe "GET edit" do
before(:each) do
@valid_user = Factory.create(:user)
sign_in(@valid_user)
end
describe "success" do
it "should have the right title" do
get :edit, :id => @valid_user
response.should have_selector("title", :content => "Edit User: #{@valid_user.name}")
end
end # success
describe "failure" do
it "should not get edit if logged out" do
sign_out
get :edit, :id => @valid_user
flash[:error].should =~ /must be logged in/i
response.should redirect_to new_user_session_path
end
end # failure
end # GET edit
describe "GET show" do
before(:each) do
@valid_user = Factory.create(:user)
sign_in(@valid_user)
end
describe "success" do
it "should get show if logged in" do
get :show, :id => @valid_user
response.should be_success
end
end # success
describe "failure" do
it "should not get show if logged out" do
sign_out
get :show, :id => @valid_user
flash[:error].should =~ /must be logged in/i
response.should redirect_to new_user_session_path
end
it "should only be able to see their own page" do
@another_user = Factory.create(:user)
get :show, :id => @another_user
response.should have_selector("title", :content => "Profile for #{@valid_user.name}")
end
end # failure
describe "admin users" do
before(:each) do
@admin_user = Factory.create(:user, :admin => true)
sign_out
sign_in(@admin_user)
end
it "should get their own show page if that is the selection" do
get :show, :id => @admin_user
response.should have_selector("title", :content => "Profile for #{@admin_user.name}")
end
it "should also be able to get other people's show page if that is the selection" do
get :show, :id => @valid_user
response.should have_selector("title", :content => "Profile for #{@valid_user.name}")
end
it "should not show admin content on admin login" do
sign_in(@valid_user)
get :show, :id => @valid_user
response.should_not have_selector("section.admin>ul>li>a", :content => "Show Users", :href => users_path)
end
end
end # GET show
describe "PUT update" do
before(:each) do
@valid_user = Factory.create(:user)
sign_in(@valid_user)
end
describe "success" do
before(:each) do
@new_attrs = { :name => "new name", :email => "myname@gmail.com", :password => @valid_user.password, :password_confirmation => @valid_user.password}
end
it "should correctly update the user with valid attributes" do
put :update, :id => @valid_user.id, :user => @new_attrs
assigns[:user].name.should == "new name"
assigns[:user].email.should == "myname@gmail.com"
User.find(@valid_user.id).email.should == "myname@gmail.com"
end
it "should redirect to the user show page" do
put :update, :id => @valid_user.id, :user => @new_attrs
response.should redirect_to user_path(@valid_user)
flash[:success].should =~ /edited/i
end
end # success
describe "failure" do
before(:each) do
@bad_attrs = { :name => "", :email => "nottaken"}
end
it "should not update user attributes if invalid" do
original_email = @valid_user.email
put :update, :id => @valid_user, :user => @bad_attrs
@valid_user.reload
@valid_user.email.should == original_email
logged_in?.should be_true
User.find_by_email(original_email).should_not be_nil
end
it "should re-render the edit page" do
put :update, :id => @valid_user, :user => @bad_attrs
#controller.stub!(:require_user).and_return(true)
response.should render_template('edit')
logged_in?.should be_true
end
it "should not allow edit, even with valid attributes, if not logged in" do
sign_out
original_email = @valid_user.email
put :update, :id => @valid_user, :user => @new_attrs
@valid_user.reload
@valid_user.email.should == original_email
response.should redirect_to new_user_session_path
logged_in?.should be_false
end
it "should not allow you to take another user's email" do
@another_user = Factory.create(:user)
put :update, :id => @valid_user, :user => { :name => "valid name", :email => @another_user.email}
response.should render_template('edit')
response.should have_selector("div.error_messages")
end
end #failure
end # post update
describe "DELETE destroy" do
before(:each) do
@valid_user = Factory.create(:user)
end
describe "as a non-signed-in user" do
it "should deny access" do
delete :destroy, :id => @valid_user
flash[:error].should =~ /must be logged in/i
response.should redirect_to new_user_session_path
end
end
describe "as a non-admin user" do
it "should protect the page" do
sign_in(@valid_user)
delete :destroy, :id => @valid_user
response.should redirect_to(root_path)
flash[:error].should be_nil
flash[:success].should be_nil
flash[:notice].should be_nil
end
end
describe "as an admin user" do
before(:each) do
@admin = Factory(:user, :admin => true)
sign_in(@admin)
end
it "should destroy the user" do
lambda do
delete :destroy, :id => @valid_user
end.should change(User, :count).by(-1)
end
it "should redirect to the users page with the correct flash" do
delete :destroy, :id => @valid_user
response.should redirect_to(users_path)
flash[:success].should =~ /user destroyed/i
end
end
end
end
用户工厂:
Factory.define :valid_user , :class => User do |u|
u.name "brandon"
u.email "brandon@example.com"
u.password "foobar"
u.password_confirmation "foobar"
end
Factory.define :invalid_user , :class => User do |u|
u.name ""
u.email "brandon@example"
u.password "f"
u.password_confirmation "f"
end
Factory.sequence :email do |n|
"person#{n}@example.com"
end
Factory.sequence :name do |n|
"John Doe the #{n}"
end
Factory.define :user do |f|
f.name {Factory.next(:name)}
f.email {Factory.next(:email)}
f.password "foobar"
f.password_confirmation "foobar"
end
等级库助手
require 'database_cleaner'
require 'spork'
require 'factory_girl'
require 'authlogic/test_case'
Spork.prefork do
# Loading more in this block will cause your tests to run faster. However,
# if you change any configuration or code from libraries loaded here, you'll
# need to restart spork for it take effect.
def sign_in(user)
u = UserSession.create(user)
end
def sign_out
us = UserSession.find
us.destroy
end
def logged_in?
current_user_session = UserSession.find
return current_user_session.record if current_user_session
return false
end
DatabaseCleaner.strategy = :truncation
# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'webrat'
include Authlogic::TestCase
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
Webrat.configure do |config|
config.mode = :rails
end
RSpec.configure do |config|
# == Mock Framework
#
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
#
# config.mock_with :mocha
# config.mock_with :flexmock
# config.mock_with :rr
config.mock_with :rspec
ApplicationController.skip_before_filter :activate_authlogic
config.before(:each, :type => :request) do
activate_authlogic
#UserSession.create(User.find_by_email!(email))
end
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
config.fixture_path = "#{::Rails.root}/spec/fixtures"
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = true
# If true, the base class of anonymous controllers will be inferred
# automatically. This will be the default behavior in future versions of
# rspec-rails.
config.infer_base_class_for_anonymous_controllers = false
end
end
Spork.each_run do
# This code will be run each time you run your specs.
FactoryGirl.reload
ActiveSupport::Dependencies.clear
RSpec.configure do |config|
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
# DatabaseCleaner.clean
end
顺便说一句(可能与我的其他问题有关),我一直在犯这个令人沮丧的错误
16) UsersController GET edit success should render the 'edit' page
Failure/Error: response.should render_template('edit')
expecting <"edit"> but rendering with <"">
# ./spec/controllers/users_controller_spec.rb:203:in `block (4 levels) in <top (required)>'
16)UsersController获取编辑成功应呈现“编辑”页面
失败/错误:response.should呈现_模板(“编辑”)
预期但渲染为
#./spec/controllers/users\u controller\u spec.rb:203:in'block(4级)in'
我很感激能提供的任何帮助,我真是束手无策!!。我会发布你需要的任何附加代码。谢谢 您没有呼叫
设置:激活\u authlogic
您没有呼叫设置:激活\u authlogic
请缩小您的问题范围。如果人们必须阅读这么多代码才能回答你的问题,他们不会很乐意回答你的问题。请缩小你的问题范围。如果人们必须阅读这么多的代码才能回答你的问题,他们不会很乐意回答你的问题。哇,我还以为这个问题已经很久没有了。。。谢谢你的回答。我的spec_helper.rb文件中有以下代码:1.include Authlogic::TestCase 2。config.before(:each)do,activate_authlogic,end(很抱歉格式化太残酷,我想我不能在这里放代码)调用activate_authlogic
inbefore(:each)
无效。你必须把它叫做throwsetup
和之后的description
。哇,我还以为这一个早就不见了呢。。。谢谢你的回答。我的spec_helper.rb文件中有以下代码:1.include Authlogic::TestCase 2。config.before(:each)do,activate_authlogic,end(很抱歉格式化太残酷,我想我不能在这里放代码)调用activate_authlogic
inbefore(:each)
无效。您必须将其称为throwsetup
和afterdescription
。
require 'spec_helper'
describe UserSessionsController do
render_views
before(:each) do
@valid_user = Factory.create(:user)
activate_authlogic
end
describe "Authlogic & Application Controller tests" do
it "should allow login of a specified user, and logged_in? should provide correct response" do
sign_in(@valid_user)
UserSession.find.user.should == @valid_user
logged_in?.should be_true
logged_in?.email.should == @valid_user.email #logged_in function actually returns session
end
it "should allow logout of a specified user and logged_in? should provide correct response" do
sign_in(@valid_user)
logged_in?.should be_true
sign_out
logged_in?.should be_false
end
end # authlogic tests
describe "GET 'new'" do
it "should only get new if logged out" do
sign_in(@valid_user)
get :new
flash[:error].should =~ /You must be logged out/i
response.should redirect_to user_path(@valid_user.id)
response.code.should == "302" # redirected by require_no_user
end
end # get new
describe "POST 'create'" do
it "should create user session" do
logged_in?.should be_false
post :create, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
logged_in?.should be_true
end
it "should redirect to user show page, with flash success" do
post :create, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
assigns[:user_session].user.should == @valid_user
response.code.should == "302"
response.should redirect_to(user_path(@valid_user.id))
flash[:success].should =~ /login succ/i
end
it "should not create user session for invalid password" do
logged_in?.should be_false
post :create, :user_session => { :email => @valid_user.email, :password => "" }
logged_in?.should be_false
end
it "should redirect back to login page on invalid params, show proper flash" do
post :create, :user_session => { :email => @valid_user.email, :password => "" }
response.should redirect_to new_user_session_path
## BROKEN BECAUSE OF BEFORE_FILTER ##
# response.should render_template('new')
#response.should have_selector("div.flash.error", :content => "Incorrect user")
flash[:error].should =~ /Incorrect user name or password/i
end
it "should only create if logged out" do
sign_in(@valid_user)
post :create, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
flash[:error].should =~ /You must be logged out/i
response.code.should == "302"
response.should redirect_to user_path(@valid_user.id)
end
end # post create
describe "DELETE destroy" do
it "should destroy user session if logged in" do
sign_in(@valid_user)
logged_in?.should be_true
delete :destroy
UserSession.find.should be_nil
response.should redirect_to new_user_session_path
end
it "should not destroy if logged out" do
logged_in?.should be_false
delete :destroy, :user_session => { :email => @valid_user.email, :password => @valid_user.password }
flash[:error].should =~ /You must be logged in/i
response.code.should == "302"
response.should redirect_to new_user_session_path
end
it "should redirect to login page and show correct flash on logout" do
sign_in(@valid_user)
logged_in?.should be_true
delete :destroy
flash[:notice].should =~ /You have been logged/i
response.should redirect_to new_user_session_path
end
end # delete destroy
end # specs
require 'spec_helper'
describe UsersController do
render_views
before(:each) do
activate_authlogic
end
describe "GET 'new'" do
it "should only work if not logged in" do
user = Factory.create(:user)
sign_in(user)
get :new
flash[:error].should =~ /must be logged out/i
response.should redirect_to user_path(user)
end
end
describe "GET index" do
before(:each) do
@admin_user = Factory.create(:user, :admin => true)
@signed_in_user = Factory.create(:user)
@user1 = Factory.create(:user)
@user2 = Factory.create(:user)
@user3 = Factory.create(:user)
@users = [@admin_user, @signed_in_user, @user1, @user2, @user3]
end
describe "for non signed in users" do
it "should deny access" do
get :index
flash[:error].should =~ /must be logged in/i
response.should redirect_to new_user_session_path
end
end
describe "for non admin users" do
it "should protect the page" do
sign_in(@signed_in_user)
get :index
response.should redirect_to(root_path)
flash[:error].should be_nil
flash[:success].should be_nil
flash[:notice].should be_nil
end
end
describe "for admin users" do
before(:each) do
sign_in(@admin_user)
end
end
end
describe "POST 'create'" do
describe "failure" do
before(:each) do
@attr = {:name=>"", :email=>"", :password=>"", :password_confirmation=>""}
end
it "should not create a user" do
lambda do
post :create, :user => @attr
end.should_not change(User, :count)
end
it "should render the 'new' page" do
post :create, :user => @attr
response.should render_template('new')
response.should have_selector("div.error_messages")
end
it "should only create a user if not logged in" do
@another_user = Factory.create(:user)
sign_in(@another_user)
@valid_attr = { :name=> 'New User', :email => 'somemail@gmail.com',:password => 'foobar', :password_confirmation => 'foobar' }
post :create, :user => @attr
flash[:error].should =~ /must be logged out/i
response.should redirect_to user_path(@another_user)
end
end #failure
describe "success" do
before(:each) do
@attr = { :name=> 'New User', :email => 'somemail@gmail.com',:password => 'foobar', :password_confirmation => 'foobar' }
end
it "should create a user" do
lambda do
post :create, :user => @attr
end.should change(User, :count).by(1)
end
it "should redirect to the user show page" do
post :create, :user => @attr
assigns[:user].email.should == "somemail@gmail.com"
response.should redirect_to(user_path(assigns(:user)))
end
it "should have a welcome message" do
post :create, :user => @attr
flash[:success].should =~ /signed/i
end
it "should be logged in" do
post :create, :user => @attr
UserSession.find.should_not be_nil
end
end #success
end # post create
describe "GET edit" do
before(:each) do
@valid_user = Factory.create(:user)
sign_in(@valid_user)
end
describe "success" do
it "should have the right title" do
get :edit, :id => @valid_user
response.should have_selector("title", :content => "Edit User: #{@valid_user.name}")
end
end # success
describe "failure" do
it "should not get edit if logged out" do
sign_out
get :edit, :id => @valid_user
flash[:error].should =~ /must be logged in/i
response.should redirect_to new_user_session_path
end
end # failure
end # GET edit
describe "GET show" do
before(:each) do
@valid_user = Factory.create(:user)
sign_in(@valid_user)
end
describe "success" do
it "should get show if logged in" do
get :show, :id => @valid_user
response.should be_success
end
end # success
describe "failure" do
it "should not get show if logged out" do
sign_out
get :show, :id => @valid_user
flash[:error].should =~ /must be logged in/i
response.should redirect_to new_user_session_path
end
it "should only be able to see their own page" do
@another_user = Factory.create(:user)
get :show, :id => @another_user
response.should have_selector("title", :content => "Profile for #{@valid_user.name}")
end
end # failure
describe "admin users" do
before(:each) do
@admin_user = Factory.create(:user, :admin => true)
sign_out
sign_in(@admin_user)
end
it "should get their own show page if that is the selection" do
get :show, :id => @admin_user
response.should have_selector("title", :content => "Profile for #{@admin_user.name}")
end
it "should also be able to get other people's show page if that is the selection" do
get :show, :id => @valid_user
response.should have_selector("title", :content => "Profile for #{@valid_user.name}")
end
it "should not show admin content on admin login" do
sign_in(@valid_user)
get :show, :id => @valid_user
response.should_not have_selector("section.admin>ul>li>a", :content => "Show Users", :href => users_path)
end
end
end # GET show
describe "PUT update" do
before(:each) do
@valid_user = Factory.create(:user)
sign_in(@valid_user)
end
describe "success" do
before(:each) do
@new_attrs = { :name => "new name", :email => "myname@gmail.com", :password => @valid_user.password, :password_confirmation => @valid_user.password}
end
it "should correctly update the user with valid attributes" do
put :update, :id => @valid_user.id, :user => @new_attrs
assigns[:user].name.should == "new name"
assigns[:user].email.should == "myname@gmail.com"
User.find(@valid_user.id).email.should == "myname@gmail.com"
end
it "should redirect to the user show page" do
put :update, :id => @valid_user.id, :user => @new_attrs
response.should redirect_to user_path(@valid_user)
flash[:success].should =~ /edited/i
end
end # success
describe "failure" do
before(:each) do
@bad_attrs = { :name => "", :email => "nottaken"}
end
it "should not update user attributes if invalid" do
original_email = @valid_user.email
put :update, :id => @valid_user, :user => @bad_attrs
@valid_user.reload
@valid_user.email.should == original_email
logged_in?.should be_true
User.find_by_email(original_email).should_not be_nil
end
it "should re-render the edit page" do
put :update, :id => @valid_user, :user => @bad_attrs
#controller.stub!(:require_user).and_return(true)
response.should render_template('edit')
logged_in?.should be_true
end
it "should not allow edit, even with valid attributes, if not logged in" do
sign_out
original_email = @valid_user.email
put :update, :id => @valid_user, :user => @new_attrs
@valid_user.reload
@valid_user.email.should == original_email
response.should redirect_to new_user_session_path
logged_in?.should be_false
end
it "should not allow you to take another user's email" do
@another_user = Factory.create(:user)
put :update, :id => @valid_user, :user => { :name => "valid name", :email => @another_user.email}
response.should render_template('edit')
response.should have_selector("div.error_messages")
end
end #failure
end # post update
describe "DELETE destroy" do
before(:each) do
@valid_user = Factory.create(:user)
end
describe "as a non-signed-in user" do
it "should deny access" do
delete :destroy, :id => @valid_user
flash[:error].should =~ /must be logged in/i
response.should redirect_to new_user_session_path
end
end
describe "as a non-admin user" do
it "should protect the page" do
sign_in(@valid_user)
delete :destroy, :id => @valid_user
response.should redirect_to(root_path)
flash[:error].should be_nil
flash[:success].should be_nil
flash[:notice].should be_nil
end
end
describe "as an admin user" do
before(:each) do
@admin = Factory(:user, :admin => true)
sign_in(@admin)
end
it "should destroy the user" do
lambda do
delete :destroy, :id => @valid_user
end.should change(User, :count).by(-1)
end
it "should redirect to the users page with the correct flash" do
delete :destroy, :id => @valid_user
response.should redirect_to(users_path)
flash[:success].should =~ /user destroyed/i
end
end
end
end
Factory.define :valid_user , :class => User do |u|
u.name "brandon"
u.email "brandon@example.com"
u.password "foobar"
u.password_confirmation "foobar"
end
Factory.define :invalid_user , :class => User do |u|
u.name ""
u.email "brandon@example"
u.password "f"
u.password_confirmation "f"
end
Factory.sequence :email do |n|
"person#{n}@example.com"
end
Factory.sequence :name do |n|
"John Doe the #{n}"
end
Factory.define :user do |f|
f.name {Factory.next(:name)}
f.email {Factory.next(:email)}
f.password "foobar"
f.password_confirmation "foobar"
end
require 'database_cleaner'
require 'spork'
require 'factory_girl'
require 'authlogic/test_case'
Spork.prefork do
# Loading more in this block will cause your tests to run faster. However,
# if you change any configuration or code from libraries loaded here, you'll
# need to restart spork for it take effect.
def sign_in(user)
u = UserSession.create(user)
end
def sign_out
us = UserSession.find
us.destroy
end
def logged_in?
current_user_session = UserSession.find
return current_user_session.record if current_user_session
return false
end
DatabaseCleaner.strategy = :truncation
# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'webrat'
include Authlogic::TestCase
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
Webrat.configure do |config|
config.mode = :rails
end
RSpec.configure do |config|
# == Mock Framework
#
# If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
#
# config.mock_with :mocha
# config.mock_with :flexmock
# config.mock_with :rr
config.mock_with :rspec
ApplicationController.skip_before_filter :activate_authlogic
config.before(:each, :type => :request) do
activate_authlogic
#UserSession.create(User.find_by_email!(email))
end
# Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
config.fixture_path = "#{::Rails.root}/spec/fixtures"
# If you're not using ActiveRecord, or you'd prefer not to run each of your
# examples within a transaction, remove the following line or assign false
# instead of true.
config.use_transactional_fixtures = true
# If true, the base class of anonymous controllers will be inferred
# automatically. This will be the default behavior in future versions of
# rspec-rails.
config.infer_base_class_for_anonymous_controllers = false
end
end
Spork.each_run do
# This code will be run each time you run your specs.
FactoryGirl.reload
ActiveSupport::Dependencies.clear
RSpec.configure do |config|
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
# DatabaseCleaner.clean
end
16) UsersController GET edit success should render the 'edit' page
Failure/Error: response.should render_template('edit')
expecting <"edit"> but rendering with <"">
# ./spec/controllers/users_controller_spec.rb:203:in `block (4 levels) in <top (required)>'