2013-08-08 2 views
6

Я хотел бы изменить некоторые вещи в контроллере и протестировать их с помощью rspec. Я хочу создать new действие для Spree::ProductsController. Это то, что я пыталсяКак написать тесты для декоратора контроллера spree?

routes.rb 

resources :products 

prodcuts_controller_decorator.rb 

Spree::ProductsController.class_eval do 
    before_filter :authenticate_spree_user!, :except => [:show, :index] 


    def new 
    @product = current_user.products.build 
    end 

end 

products_controller_spec.rb 

require 'spec_helper' 
describe Spree::ProductsController do 
    let(:user) {create(:user)} 

    before(:each) do 
     Spree::Core::Engine.routes 
     BigPlanet::Application.routes 
     controller.stub :spree_current_user => user 
    end 

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

    end 
end 

Но его использование оригинального Spree::Controller и дает

Failure/Error: get :new 
ActionController::RoutingError: 
No route matches {:controller=>"spree/products", :action=>"new"} 

Если кто-нибудь может засунуть меня в правильном направлении, то это было бы здорово.

ответ

6

Попробуйте изменить описания от

describe Spree::ProductsControllerDecorator do 

в

describe Spree::ProductsController do 

RSpec выводит много материала из класса описывается. Вы также хотите добавить следующее в RSpec файла:

before(:each) { @routes = Spree::Core::Engine.routes } 

Это будет вручную установить маршруты в RSpec включить Шпрее маршруты. Поскольку маршрут в spree/products_controller # new не определен в вашем приложении (но в Spree вместо этого), вам придется вручную переопределить ваши маршруты, как это.

+0

Жаль, что это уже было 'Spree :: ProductsController', исправлено, но ошибка сохраняется – benchwarmer

+0

Я отредактировал ответ с помощью дополнительного шага, который вы можете использовать. Мы используем это в нескольких приложениях Spree для тестирования декораторов с помощью rspec. – gmacdougall

+0

Добавлены маршруты, как было предложено .. все же он не идентифицирует маршруты – benchwarmer

0

в spec_helper.rb, вам нужно добавить

require 'spree/core/testing_support/controller_requests' 

затем добавьте

config.include Spree::Core::TestingSupport::ControllerRequests, :type => :controller 
config.include Devise::TestHelpers, :type => :controller 

в блоке с

RSpec.configure do |config| 

объяснение и вежливость http://rohanmitchell.com/2012/06/writing-controller-tests-for-spree-controllers/

+0

вы также можете поместить это в файл rails_helper.rb –

Смежные вопросы