2010-08-26 27 views
4

請耐心等待,因爲我對rails有點新(尤其是rails 3),而且我有點被這個難住了。基本上我想在使用RSpec的應用程序中測試我的CustomersController。當我執行我的規格試圖執行後在我的控制器中的create動作,我得到這個錯誤,我不知道爲什麼:受Rails 3 RC,Mongoid和Recaptcha以及RSpec保護的「拒絕」方法觸發

1) CustomersController as guest should render new template when executing create action with invalid model 
    Failure/Error: post :create, :customer => model 
    protected method `reject' called for #<Customer:0x0000010611c400> 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/mongoid-2.0.0.beta.16/lib/mongoid/attributes.rb:23:in `method_missing' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/activemodel-3.0.0.rc/lib/active_model/mass_assignment_security/sanitizer.rb:6:in `sanitize' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/activemodel-3.0.0.rc/lib/active_model/mass_assignment_security.rb:153:in `sanitize_for_mass_assignment' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/mongoid-2.0.0.beta.16/lib/mongoid/attributes.rb:42:in `process' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/mongoid-2.0.0.beta.16/lib/mongoid/document.rb:104:in `initialize' 
    # ./app/controllers/customers_controller.rb:11:in `new' 
    # ./app/controllers/customers_controller.rb:11:in `create' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/abstract_controller/base.rb:136:in `process_action' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/action_controller/metal/rendering.rb:11:in `process_action' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/abstract_controller/callbacks.rb:18:in `block in process_action' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.0.rc/lib/active_support/callbacks.rb:429:in `_run__4199577925444808436__process_action__3619821760006806352__callbacks' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.0.rc/lib/active_support/callbacks.rb:404:in `_run_process_action_callbacks' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.0.rc/lib/active_support/callbacks.rb:93:in `run_callbacks' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/abstract_controller/callbacks.rb:17:in `process_action' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/action_controller/metal/instrumentation.rb:30:in `block in process_action' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.0.rc/lib/active_support/notifications.rb:52:in `block in instrument' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.0.rc/lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.0.rc/lib/active_support/notifications.rb:52:in `instrument' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/action_controller/metal/instrumentation.rb:29:in `process_action' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/action_controller/metal/rescue.rb:17:in `process_action' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/abstract_controller/base.rb:105:in `process' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/abstract_controller/rendering.rb:40:in `process' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/action_controller/metal/testing.rb:12:in `process_with_new_base_test' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/action_controller/test_case.rb:404:in `process' 
    # /Users/scott/.rvm/gems/ruby-1.9.2-p0/gems/actionpack-3.0.0.rc/lib/action_controller/test_case.rb:347:in `post' 
    # ./spec/controllers/customers_controller_spec.rb:14:in `block (2 levels) in <top (required)>' 

現在,我真的很抱歉,但這裏的一大把代碼要遵循。首先是我的寶石。現在

mongoid (2.0.0.beta.16) 
mongoid-rspec (1.2.0) 
... 
rspec (2.0.0.beta.19) 
rspec-core (2.0.0.beta.19) 
rspec-expectations (2.0.0.beta.19) 
rspec-mocks (2.0.0.beta.19) 
rspec-rails (2.0.0.beta.19) 
... 
rails (3.0.0.rc) 
... 
recaptcha (0.2.3) 

,我有我的CustomersController定義如下:

class CustomersController < ApplicationController 

    respond_to :html 
    before_filter :authenticate_customer!, :except => [ :new, :create ] 

    def new 
    @customer = Customer.new 
    end 

    def create 
    @customer = Customer.new(params[:customer]) 
    if verify_recaptcha(:model => @customer, :message => "Image verification failed. Please try again.") && @customer.save 
     flash[:notice] = "Your account has been created successfully" 
    end 
    respond_with @customer 
    end 

    def show 
    end 
end 

這裏是我的客戶模型:

class Customer 
    include Mongoid::Document 
    devise :database_authenticatable, :recoverable, :rememberable, 
    :trackable, :validatable 

    field :first_name 
    field :last_name 
    field :email 
    field :roles, :type => Array, :default => [ 'User' ] 

    embeds_many :servers 

    validates_presence_of :first_name 
    validates_presence_of :last_name 
    validates_presence_of :email 
    validates_presence_of :roles 

    validates_uniqueness_of :email 

    attr_accessible :first_name, :last_name, :email, 
        :password, :password_confirmation 

    def role?(role) 
    return !!self.roles.include?(role.to_s.camelize) 
    end 

end 

最後,這裏是我的規格:

describe CustomersController, "as guest" do 
    include Devise::TestHelpers 

    it "should render new template when executing new action" do 
    get :new 
    response.should render_template(:new) 
    end 

    it "should render new template when executing create action with invalid model" do 
    model = Customer.new(:first_name => "Test", :last_name => "user") 
    post :create, :customer => model 
    response.should render_template(:new) 
    end 
end 

回答

2

事實證明,我有在我的每個測試中傳遞一個元組而不是實際的模型對象。我切換到使用factory_girl創建我的模型對象,然後在每個模型對象上調用attributes_for方法。我將該結果傳遞給create操作,並且所有操作都按預期工作。