2013-04-26 87 views
0

我正在使用Rspec(2.13.0)請求規格測試移動站點的登錄api。我有一個login_user方法,可以正確寫入用戶測試數據庫並在db中生成一個auth_token。在Rspec請求規範中訪問會話變量規範

我不認爲auth_token在示例「只測試mobile-login-page」中作爲會話值被正確設置。我可以看到,雖然登錄後發生了重定向,並且發送了正確的auth_token(請參閱login_user方法中的註釋)。

是我的語法不正確(這是我第一次使用請求規範這樣的東西)?使用控制器規格或使用機架測試會更好嗎?

THX提前

def login_user 
    @user = FactoryGirl.create :user 
    visit '/arc/signin' 
    fill_in 'Email', with: '[email protected]' 
    fill_in 'Password', with: 'foobar' 
    click_button 'Log in' 
    # from test.log showing that auth_token is actually called 
    # Processing by UsersController#home as HTML 
    # ESC[1mESC[35mUser Load (0.4ms)ESC[0m SELECT `users`.* FROM `users` WHERE `users`.`auth_token` = 'pCnpG90vIw3qUAoXx3EBsA' LIMIT 1 
    # 
end 

it "just testing the mobile-login-page" do 
    login_user 
    get '/arc/v1/api/signup-mobile-test' 
    puts response.body 
    JSON.parse(response.body)[:auth_token] == (@user.auth_token) 
end 

在控制器:

def create_user_test           
    m={}               
    m[:status]="success"           
    m[:auth_token]=session[:auth_token] 
    render :json => m.to_json          
end                

和這裏的輸出:

Fri Apr 26$ rspec spec/requests/static_page_spec.rb 
{"status":"success","auth_token":null} 
..... 

Finished in 0.80587 seconds 
5 examples, 0 failures 
+0

你在起訴嗎? – 2013-04-26 19:41:31

+0

不,只是has_secure_password;我可以驗證用戶和auth_token是否在數據庫中正確創建。 – timpone 2013-04-26 19:42:31

回答

2

您使用兩種不同的測試線束,他們不共享會話狀態。

你使用經過水豚和機架測試的visitfill_in,並且click_button方法:http://rubydoc.info/gems/capybara/Capybara/Session#visit-instance_method

你使用使API請求來自Rails的該get方法內置集成測試:http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-get

如果在第二個示例中使用visit而不是get,將從login_user創建的會話將可見。

請注意,通常不建議使用水豚測試API,因爲水豚被設計爲通過用戶界面與實際用戶交互。我假設你正在用一個JavaScript API測試一個豐富的UI。

如果是這樣的話,我會使用的兩種測試方法的組合:

  • 水豚規範其通過用戶界面導航,從不直接訪問API。這些規格可以使用登錄時生成的會話。
  • 控制器規格直接命中API以快速測試邊緣案例和條件。這些規範可以將會話直接傳遞給控制器​​,或使用模擬框架將認證存檔。
+0

thx喬,這很有道理。使用控制器規格來測試api也符合話語應用程序的測試。 – timpone 2013-04-26 20:01:07