2013-04-26 89 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