2010-08-26 3 views
4

Veuillez me supporter car je suis un peu nouveau sur les rails (en particulier les rails 3), et je suis un peu perplexe. Fondamentalement, je veux tester mon CustomersController dans mon application en utilisant RSpec. Quand j'exercerai mes specs essayant d'effectuer un poste à créer une action dans mon contrôleur, je reçois cette erreur, et je ne sais pas pourquoi:méthode de "rejet" protégée tirant avec Rails 3 RC, Mongoid, et Recaptcha et 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)>' 

Maintenant, je suis vraiment désolé, mais est ici aa beaucoup de code à suivre. Le premier est mes gemmes.

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) 

Maintenant, je l'ai obtenu mon CustomersController défini comme suit:

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 

Voici mon modèle client:

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 

Enfin, voici mon spec:

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 

Répondre

2

Eh bien, il se trouve que j'avais pour passer un tuple au lieu de l'objet modèle réel dans chacun de mes tests. Je suis passé à l'aide de factory_girl pour créer mes objets de modèle, puis j'ai appelé la méthode attributes_for sur chaque objet de modèle. J'ai passé ce résultat à l'action create, et tout a fonctionné comme prévu.

Questions connexes