2012-05-30 102 views
1

我正在測試我的控制器,但請求是通過ajax來的。我不知道我該如何解決這個問題。我嘗試像HTTP請求的方式,但我在HTTP請求之前用戶XHR。然而,當我運行測試,我看這個問題,RSpec控制器ajax請求測試

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)>' 

我有一個控制器,所有Ajax請求都記錄在這裏DB,

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 

所有情景是,用戶訪問該側和點擊含有樂譜等其他信息的鏈接,ajax將數據發送給控制器以保存它,就像你在控制器中看到的一樣。

但我解決不了?我怎麼能夠?

+0

我的答案是否解決了您的問題? – Salil

回答

1

您的更新方法更新@widget對象,而無需使用update_attributes方法:

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! 

但是,你的更新測試預計您將調用 @ widget.update_attributes(PARAMS)

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   

我想想最有可能的是,原來的更新方法確實調用了update_attributes,然後修改了代碼。這就是現在測試失敗的原因。

+0

我修正了我的規格控制器,如 描述「更新小部件分數」做 它「需要小部件費率信息」做 WidgetTraffic.stub(:new).with({'these'=>'params'}){mock_widget_traffic :保存=>真)} XHR:放,:更新,:widget_traffic => { '這些'=> 'PARAMS'} 受讓人(:widget_traffic)== @mock_widget_traffic response.should be_success 端 端 – ndrx42

+0

但我在這段時間看到了這些錯誤, 1)RwsController更新小部件分數需要小部件費率信息 失敗/錯誤:put:update,id:@widget,widget:Factory.attributes_for(:widget) NoMethodError: undefined meth od'score ='for nil:NilClass #./app/controllers/rws_controller.rb:23:in'update' #./spec/controllers/rws_controller_spec.rb:34:in'block(3 levels)in <頂部(必填)>' – ndrx42

+0

這意味着Widget.find_by_uuid(params [:uuid])返回零。您可以通過查看生成的SQL並檢查表數據來使用rails控制檯來調試此問題。 – Salil