我正在使用Rspec(2.13.0)请求规范测试移动网站的登录API。我有一个login_user方法,它正确地将用户写入测试数据库并在db中生成auth_token。
我不认为auth_token被正确设置为示例“仅测试mobile-login-page”中的会话值。我可以看到重定向发生在登录之后,并且在该重定向上发送了正确的auth_token(请参阅login_user方法中的注释)。
我的语法不正确(这是我第一次使用请求规范这样的事情)?使用控制器规范或使用机架测试会更好吗?
事先提前def login_user
@user = FactoryGirl.create :user
visit '/arc/signin'
fill_in 'Email', with: 'jxt@jxt.com'
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 :(得分:2)
您使用的是两种不同的测试工具,但它们不共享会话状态。
您正在使用的visit
,fill_in
和click_button
方法通过水豚和机架测试:http://rubydoc.info/gems/capybara/Capybara/Session#visit-instance_method
您用于发出API请求的get
方法来自Rails的内置集成测试:http://api.rubyonrails.org/classes/ActionDispatch/Integration/RequestHelpers.html#method-i-get
如果您在第二个示例中使用visit
而不是get
,那么从login_user
创建的会话将会显示。
请注意,通常不推荐使用capybara直接测试API,因为水豚旨在通过用户界面与网站进行交互,这是实际用户的意愿。我假设您正在使用JavaScript API测试丰富的UI。
如果是这种情况,我会使用两种测试方法的组合: