Не удается протестировать с помощью контроллера rspec POST create action(devise и cancan)
мне трудно получить тест rspec для контроллера, чтобы пройти. Я хотел бы проверить, что действие POST create работает. Я использую rails (3.0.3), cancan (1.4.1), devise (1.1.5), rspec (2.3.0)
модель мертва просто
class Account < ActiveRecord::Base
attr_accessible :name
end
регулятор стандартн также (прямо из лесов)
class AccountsController < ApplicationController
before_filter :authenticate_user!, :except => [:show, :index]
load_and_authorize_resource
...
def create
@account = Account.new(params[:account])
respond_to do |format|
if @account.save
format.html { redirect_to(@account, :notice => 'Account was successfully created.') }
format.xml { render :xml => @account, :status => :created, :location => @account }
else
format.html { render :action => "new" }
format.xml { render :xml => @account.errors, :status => :unprocessable_entity }
end
end
end
и тест rspec, который я хотел бы пройти (извините за название, возможно, не самый подходящий один)
it "should call create on account when POST create is called" do
@user = Factory.create(:user)
@user.admin = true
@user.save
sign_in @user #this is an admin
post :create, :account => {"name" => "Jimmy Johnes"}
response.should be_success
sign_out @user
end
но все, что я получаю, это
AccountsController get index should call create on account when POST create is called
Failure/Error: response.should be_success
expected success? to return true, got false
# ./spec/controllers/accounts_controller_spec.rb:46
другие действия могут быть протестированы и пройти (т. е. получить новые)
вот тест для GET new
it "should allow logged in admin to call new on account controller" do
@user = Factory.create(:user)
@user.admin=true
@user.save
sign_in @user #this is an admin
get :new
response.should be_success
sign_out @user
end
и для завершения вот файл возможность
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.admin?
can :manage, :all
else
can :read, :all
end
end
end
какие идеи? Я предполагаю, что я использую неправильное ожидание rspec, так как код действительно работает (просто тест не выполняется по желанию!)
2 ответов
response.should be_success
возвращает true, если код ответа в диапазоне 200-299. Но действие create перенаправляет, поэтому код ответа получает значение 302, таким образом, сбой.
вы можете проверить это с помощью response.should redirect_to
. Проверьте выход стандартного генератора контроллера RSpec для примера, который может выглядеть следующим образом:
it "redirects to the created account" do
Account.stub(:new) { mock_account(:save => true) }
post :create, :account => {}
response.should redirect_to(account_url(mock_account))
end
тест rspec, который прошел тест, был (благодаря совету zetetic):
it "should call create on account when POST create is called" do
@user = Factory.create(:user)
@user.admin = true
@user.save
sign_in @user #this is an admin
account = mock_model(Account, :attributes= => true, :save => true)
Account.stub(:new) { account }
post :create, :account => {}
response.should redirect_to(account_path(account))
sign_out @user
end