Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to write tests for spree controller decorator?

I'd like to modify some things in the controller and test them using rspec. I want to create new action for Spree::ProductsController. This is what I've tried

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

But its using original Spree::Controller and gives

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

If anyone can shove me in the right direction then it'd great.

like image 667
benchwarmer Avatar asked Aug 08 '13 11:08

benchwarmer


2 Answers

Try changing your describe from

describe Spree::ProductsControllerDecorator do

to

describe Spree::ProductsController do

RSpec infers a lot of stuff from the class being described. You'll also want to add the following to the rspec file:

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

This will manually set the routes in RSpec to include the Spree routes. Since the route to spree/products_controller#new is not defined in your application (but in Spree instead) you'll have to manually override your routes like this.

like image 91
gmacdougall Avatar answered Sep 19 '22 06:09

gmacdougall


in spec_helper.rb, you'll need to add

require 'spree/core/testing_support/controller_requests'

then, add

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

in the

RSpec.configure do |config|

block

explanation and courtesy of http://rohanmitchell.com/2012/06/writing-controller-tests-for-spree-controllers/

like image 1
Richard Kuo Avatar answered Sep 20 '22 06:09

Richard Kuo