2013-08-08 27 views
6

Tôi muốn sửa đổi một số thứ trong bộ điều khiển và kiểm tra chúng bằng rspec. Tôi muốn tạo hành động new cho Spree::ProductsController. Đây là những gì tôi đã cố gắngLàm thế nào để viết kiểm tra cho trang trí bộ điều khiển 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 

Nhưng nó sử dụng ban đầu Spree::Controller và cho

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

Nếu bất cứ ai có thể xô tôi đi đúng hướng thì nó muốn tuyệt vời.

Trả lời

6

Hãy thử thay đổi của bạn mô tả từ

describe Spree::ProductsControllerDecorator do 

để

describe Spree::ProductsController do 

RSpec suy luận rất nhiều thứ từ lớp được mô tả. Bạn cũng sẽ muốn thêm thông tin sau vào tệp rspec:

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

Điều này sẽ tự đặt tuyến đường trong RSpec để bao gồm các tuyến Spree. Vì route đến spree/products_controller # new không được định nghĩa trong ứng dụng của bạn (nhưng thay vào đó là Spree) bạn sẽ phải tự ghi đè lên các route như thế này.

+0

Xin lỗi nó đã là 'Spree :: ProductsController', đã sửa, nhưng lỗi vẫn còn – benchwarmer

+0

Tôi đã chỉnh sửa câu trả lời bằng một bước bổ sung mà bạn có thể sử dụng. Chúng tôi sử dụng điều này trong một số ứng dụng Spree để kiểm tra trang trí với rspec. – gmacdougall

+0

Đã thêm các tuyến đường như được đề xuất .. vẫn không xác định được các tuyến đường – benchwarmer

0

trong spec_helper.rb, bạn sẽ cần phải thêm

require 'spree/core/testing_support/controller_requests' 

sau đó, thêm

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

trong khối

RSpec.configure do |config| 

giải thích và kê biếu không của http://rohanmitchell.com/2012/06/writing-controller-tests-for-spree-controllers/

+0

bạn cũng có thể đặt điều này trong tệp rails_helper.rb –