2013-08-08 10 views
6

Chciałbym zmodyfikować niektóre rzeczy w kontrolerze i przetestować je za pomocą rspec. Chcę utworzyć akcję new dla Spree::ProductsController. To co próbowałemJak pisać testy dla dekoratora kontrolera 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 

ale jego użyciu oryginalnego Spree::Controller i daje

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

Jeśli ktoś może wpakować mnie we właściwym kierunku, to bym świetnie.

Odpowiedz

6

Spróbuj zmienić opisać z

describe Spree::ProductsControllerDecorator do 

do

describe Spree::ProductsController do 

RSpec wyprowadza wiele rzeczy z klasy są opisane. Warto również dodać następujące do pliku rspec:

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

To będzie ręcznie ustawić trasy w RSpec obejmować trasy Spree. Ponieważ trasa do spree/products_controller # new nie jest zdefiniowana w twojej aplikacji (ale zamiast tego w Spree) musisz ręcznie nadpisać trasy takie jak ta.

+0

Niestety to już było 'Spree :: ProductsController', poprawione, ale błąd nie ustąpi – benchwarmer

+0

edytowany odpowiedź z dodatkowego kroku, które można wykorzystać. Używamy tego w kilku aplikacjach Spree do testowania dekoratorów za pomocą rspec. – gmacdougall

+0

Dodałem trasy zgodnie z sugestią .. nadal nie identyfikuje tras – benchwarmer

0

w spec_helper.rb, trzeba dodać

require 'spree/core/testing_support/controller_requests' 

następnie dodaj

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

w bloku

RSpec.configure do |config| 

wyjaśnień i dzięki uprzejmości http://rohanmitchell.com/2012/06/writing-controller-tests-for-spree-controllers/

+0

możesz również umieścić to w pliku rails_helper.rb –