gpt4 book ai didi

ruby-on-rails-3 - Rspec、CanCan 和 Devise

转载 作者:行者123 更新时间:2023-12-04 18:52:28 26 4
gpt4 key购买 nike

我正在开始一个项目,我希望能够测试一切:)

我对 CanCan 和设计有一些问题。

例如,我有一个 Controller 联系人。每个人都可以查看,每个人(被禁止的人除外)都可以创建联系人。

#app/controllers/contacts_controller.rb
class ContactsController < ApplicationController
load_and_authorize_resource

def index
@contact = Contact.new
end

def create
@contact = Contact.new(params[:contact])
if @contact.save
respond_to do |f|
f.html { redirect_to root_path, :notice => 'Thanks'}
end
else
respond_to do |f|
f.html { render :action => :index }
end
end
end
end

代码有效,但我不知道如何测试 Controller 。
我试过这个。如果我评论 load_and_authorize_resource 行,这会起作用。
#spec/controllers/contacts_controller_spec.rb
require 'spec_helper'

describe ContactsController do

def mock_contact(stubs={})
(@mock_ak_config ||= mock_model(Contact).as_null_object).tap do |contact|
contact.stub(stubs) unless stubs.empty?
end
end

before (:each) do
# @user = Factory.create(:user)
# sign_in @user
# @ability = Ability.new(@user)
@ability = Object.new
@ability.extend(CanCan::Ability)
@controller.stubs(:current_ability).returns(@ability)
end

describe "GET index" do
it "assigns a new contact as @contact" do
@ability.can :read, Contact
Contact.stub(:new) { mock_contact }
get :index
assigns(:contact).should be(mock_contact)
end
end

describe "POST create" do

describe "with valid params" do
it "assigns a newly created contact as @contact" do
@ability.can :create, Contact
Contact.stub(:new).with({'these' => 'params'}) { mock_contact(:save => true) }
post :create, :contact => {'these' => 'params'}
assigns(:contact).should be(mock_contact)
end

it "redirects to the index of contacts" do
@ability.can :create, Contact
Contact.stub(:new) { mock_contact(:save => true) }
post :create, :contact => {}
response.should redirect_to(root_url)
end
end

describe "with invalid params" do
it "assigns a newly created but unsaved contact as @contact" do
@ability.can :create, Contact
Contact.stub(:new).with({'these' => 'params'}) { mock_contact(:save => false) }
post :create, :contact => {'these' => 'params'}
assigns(:contact).should be(mock_contact)
end

it "re-renders the 'new' template" do
@ability.can :create, Contact
Contact.stub(:new) { mock_contact(:save => false) }
post :create, :contact => {}
response.should render_template("index")
end
end

end
end

但是这些测试完全失败了......
我在网上什么也没看到...... :(
所以,如果你能在我必须遵循的方式上给我建议,我会很高兴听到你的声音:)

最佳答案

CanCan不打电话Contact.new(params[:contact]) .相反,它调用 contact.attributes = params[:contact]稍后根据当前的能力权限应用一些初始属性。

Issue #176有关此问题的详细信息和替代解决方案。如果不是更早的话,我计划在 CanCan 1.5 版中解决这个问题。

关于ruby-on-rails-3 - Rspec、CanCan 和 Devise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4200343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com