2012-11-21 32 views
0

我正在使用雙/存根編寫測試,並且我想給我返回一個假值,但是我得到的是假的值和實際值。這裏是我的控制器和spec文件,模型沒有任何內容。任何想法我做錯了什麼?我的猜測是我完全錯了。附:我有點新的符合規格和模擬/存根事情在測試中獲得2個返回而不是1個

控制器:

def destroy 
    uri = URI('example.com') 
    request_params = {'requestId' => @session.id, 
     'merchantId' => MERCHANTID, 
     'locale' => LOCALE, 
     'partnerId' => PARTNERID, 
     'sessionId' => params[:id] 
    } 

    Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http| 
     request = Net::HTTP::Post.new uri.request_uri 
     request.set_form_data(request_params) 
     #request.content_type = 'application/x-www-form-urlencoded' 
     response = http.request request # Net::HTTPResponse object 
     json = ActiveSupport::JSON.decode(response.body) 
     puts '<<<<<<<<<' 
     puts json 
     if json['expireSessionRes']['isError'] == false 
     render :json => {:status => 'ok', :message => 'logged out'} 
     else 
     render :json => {:status => 'failed', :message => 'logout failed'} 
     end 
    end 

spec文件:

it "should correctly return isError false if logout was sucessful" do 
    SID = "123" 
    @data3 = {:id => SID} 
    delete :destroy, default_rest_params.merge(@data3) 
    response = double('http.request') 
    response.stub!(:body => '{"expireSessionRes"=>{"requestId"=>"72", "sessionId"=>"123", "isError"=>false, "desc"=>""}}') 
    puts response.body 


    end 

接收:

{"expireSessionRes"=>{"requestId"=>"94", "isError"=>true, "desc"=>"Session exipred", "errorCode"=>"-10011"}} 
{"expireSessionRes"=>{"requestId"=>"72", "sessionId"=>"123", "isError"=>false, "desc"=>""}} 

首先來自控制器 第二從存根

回答

1

所以有嘲弄和殘留的事情是,你必須把你的模擬對象掛到你真實的代碼上...... double('http.request')位只是創建一個名爲「http.request」的模擬對象,它不會使http.request返回這個目的。

你需要做的是存根request方法返回模擬響應。但是注入模擬會非常困難,因爲您無法訪問塊中的http對象。

難度測試代碼通常是您需要重構代碼的好兆頭。

最簡單的事情是用一條線

response = Net::HTTP.post_form(uri, request_params) 

更換整個Net::HTTP.start的事情,那麼你可以通過做

remote_response = double('remote_response', body: '...') 
Net::HTTP.stub(:post_form).and_return(remote_response) 

delete :destroy, ... 

response.should whatever 

測試它(我假設你在一個控制器是spec,你將需要RSpec提供的response對象,所以你的模擬不能存儲在名爲response的變量中)。

但是,這只是更重要的一點,你應該將遠程服務交互提取到專門的類中,並單獨進行測試,它不屬於控制器。

希望有幫助!

相關問題