2012-05-29 8 views
9

में नहीं देखा जा सकता है मेरे पास एक रेल ऐप है और मैं इसका परीक्षण करने की कोशिश कर रहा हूं। मैं में लॉग इन करने वसीयत का उपयोग हालांकि, मैं कोई समस्या होती है कि जब मैं परीक्षण करना चाहते हैं का सामना करना पड़ा।नियंत्रक मैक्रोस आरएसपीसी

Users/ender/Projects/ratingw/spec/controllers/widgets_controller_spec.rb:4:in `block in <top (required)>': undefined local variable or method `login_user' for #<Class:0x007fe909bd5070> (NameError) 

सबसे पहले, मुझे लगता है कि मैं this devise formal tutorial पढ़ कहना चाहता हूँ।

मेरे spec_helper.rb है:

# 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 'capybara/rspec' 

# 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} 

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 

    OmniAuth.config.test_mode = true 

    OmniAuth.config.mock_auth[:twitter] = { 
     :provider => 'twitter', 
     :uid => '123545' 
     # etc. 
    } 

    OmniAuth.config.mock_auth[:twitter] = :invalid_credentials 

    config.include Devise::TestHelpers, :type => :controller 

    config.extend ControllerMacros, :type => :controller 

    config.include RequestMacros, :type => :request 

    # 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 

module ::RSpec::Core 
    class ExampleGroup 
    include Capybara::DSL 
    include Capybara::RSpecMatchers 
    end 
end 

और यह भी मैं एक controller_macros.rb, जो समर्थन फ़ाइल में स्थित है है:

module ControllerMacros 
    def login_user 
    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:user] 
     user = Factory(:user) 
     #user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the confirmable module 
     sign_in user 
    end 
    end 
end 

और अंत में, मेरी controller_spec फ़ाइल है:

require 'spec_helper' 

describe WidgetsController do 
    login_user 

    describe "User" do 
    before(:each) do 
     @current_user = mock_model(User, :id => 1) 
     @widget = mock_model(Widget, :user_id => 1) 
     Widget.stub!(:current_user).and_return(@current_user) 
     Widget.stub!(:widgets).and_return(@widget) 
    end 

    it "should have a current_user" do 
     subject.current_user.should_not be_nil 
     redirect_to widgets_path 
    end 

    it "should not have a current_user" do 
     redirect_to widgets_path new_user_session_path 
    end 
    end 

    def mock_widget(stubs={}) 
    @mock_widget ||= mock_model(Widget, stubs).as_null_object 
    end 

    describe "Get index" do 
    it "should get all widgets " do 
     Widget.stub(:all) { [mock_widget] } 
     get :index 
     assigns(:widgets) == @widgets 
    end 
    end 

    describe "Post widget" do 
    it "creates a new widget" do 
     Widget.stub(:new).with({'these' => 'params'}) { mock_widget(:save => true) } 
     post :create, :widget => {'these' => 'params'} 
     assigns(:widget) == @widgets 
     response.should redirect_to (edit_widget_path(@mock_widget)) 
    end 

    it "can not create a new widget" do 
     Widget.stub(:new).with({'these' => 'params'}) { mock_widget(:save => false) } 
     post :create, :widget => {'these' => 'params'} 
     assigns(:widget) == @widgets 
     redirect_to new_widget_path 
    end 
    end 

    describe "Get widget" do 
    it "shows exact widget via its uuid" do 
     Widget.stub(:find).with("10") { mock_widget(:save => true) } 
     get :show 
     assigns(:widget) == @widget 
    end 
    end 

    describe "Put widget" do 
    it "updates the widget attributes" do 
     Widget.stub(:find_by_uuid).with("6").and_return(mock_widget(:update_attributes => true)) 
     mock_widget.should_receive(:update_attributes).with({'these' => 'params'}) 
     put :update, :uuid => "6", :widget => {'these' => 'params'} 
     response.should redirect_to (edit_widget_path(@mock_widget)) 
    end 

    it "can not update the widget attributes" do 
     Widget.stub(:find_by_uuid).with("6").and_return(mock_widget(:update_attributes => false)) 
     mock_widget.should_receive(:update_attributes).with({'these' => 'params'}) 
     put :update, :uuid => "6", :widget => {'these' => 'params'} 
    end 
    end 

    describe "delete destroy" do 
    it "destroys the requested widget" do 
     Widget.stub(:find_by_uuid).with("10").and_return(mock_widget) 
     mock_widget.should_receive(:destroy) 
     get :destroy, :uuid => "10" 
    end 
    end 
end 

मैं इसे कैसे ठीक कर सकता हूं? समस्या क्या है?

उत्तर

13

मुझे लगता है कि त्रुटि उपजी से:

config.extend ControllerMacros, :type => :controller 

आप होना चाहिए:

config.include ControllerMacros, :type => :controller 
+5

यह मेरे लिए काम नहीं कर रहा। –

संबंधित मुद्दे