[rspec-users] RSpec testing update action with ajax

zombiebit enderyurt at gmail.com
Wed May 30 09:18:49 UTC 2012


Hey,
I want to test my Rails app. When you click the image ajax sends to data to
DB and the data is updated in there. When I try to test, I faced with this
problem,


  1) RwsController Update widget score takes widget rate information
     Failure/Error:
mock_widget.should_receive(:update_attributes).with({'these' => 'params'})
       (Mock "Widget_1003").update_attributes({"these"=>"params"})
           expected: 1 time
           received: 0 times
     # ./spec/controllers/rws_controller_spec.rb:28:in `block (3 levels) in
<top (required)>'


*This is my actual controller which I try to test,*


class RwsController < ApplicationController
  layout 'widget'
  skip_before_filter :verify_authenticity_token, :only => [:edit, :update,
:show, :getUserInfo]
  respond_to :js, :json, :html

  #cookie check and show exact view
  def show
    @widget = Widget.find_by_uuid(params[:uuid])
    if cookies["last_widget_id"] == @widget.uuid
      render :action => "generate"
    end
    @widget = Widget.find_by_uuid(params[:uuid])
  end

  def edit
    @widget = Widget.find_by_uuid(params[:uuid])
  end

  #after rating the rates and other details record on DB
  def update
    @widget = Widget.find_by_uuid(params[:uuid])
    #logger.info("score-in:  " + params[:score])
    @widget.score = params[:score].to_i
    @widget.total_score = params[:total_score].to_i
    @widget.click_number = params[:click_number].to_i
    @widget.average = params[:average].to_i
    #set cookie
    cookies[:last_widget_id] = {:value => @widget.uuid, :expires =>
1.year.from_now}
    @widget.save!
    #render :text => 'ok'
    #logger.info("score-out:  " + @widget.score.to_s)
    #logger.info("cookie-id:  " +  cookies[:last_widget_id])
  end

  #iframe creates and calls .js.erb file
  def generate
    @widget = Widget.find_by_uuid(params[:uuid])
    #@widget_id = @widget.id
    respond_to do |format|
      format.js {}
    end
  end

  #recording the visitor who visit the page
  def getUserInfo
    data = params[:mainURL]
    data1 = params[:mainBrowserAgent]
    data2 = params[:mainReferer]
    data3 = params[:mainDisplayInfo]
    data4 = params[:currentWidgetId]
    @widgetTraffic = WidgetTraffic.new(params[:widget_traffic])
    @widgetTraffic.widget_id = @widget_id
    @widgetTraffic.main_url = data
    @widgetTraffic.main_browser = data1
    @widgetTraffic.main_referer = data2
    @widgetTraffic.main_display = data3
    @widgetTraffic.widget_id = data4


    @widgetTraffic.save!
    render :text => 'ok'
  end
end


*And this is my test controller,
*
require 'spec_helper'

describe RwsController do

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

  describe "Get widget" do
    it "gets generated widget in iframe" do
      Widget.stub(:find_by_uuid).with("10") { mock_widget(:save => true) }
      get :generate ,:uuid => "10"
      assigns(:widget) == @widget
      response.should render_template(:js => "generate")
    end

    it "can not get generated widget in iframe" do
      Widget.stub(:find_by_uuid).with("10") { mock_widget(:save => false) }
      get :generate, :uuid => "10"
      assigns(:widget) == @widget
      response.code.should == "406"
    end
  end

  describe "Update widget score" do
    it "takes widget rate information" do
     
Widget.stub(:find_by_uuid).with("6").and_return(mock_widget(:update_attributes
=> true))
      mock_widget.should_receive(:update_attributes).with({'these' =>
'params'})
      xhr :put, :update, :uuid => "6", :widget => {'these' => 'params'},
:format => :js
      response.should be_success
    end
  end

end

*Where is the stuck point? How should I solve it?*

--
View this message in context: http://ruby.11.n6.nabble.com/RSpec-testing-update-action-with-ajax-tp4975810.html
Sent from the rspec-users mailing list archive at Nabble.com.


More information about the rspec-users mailing list