0

我正在使用 Rspec (2.13.0) 请求规范为移动站点测试登录 api。我有一个 login_user 方法,它可以正确地将用户写入测试数据库并在 db 中生成一个 auth_token。

我不认为 auth_token 在“仅测试移动登录页面”示例中被正确设置为会话值。我可以看到重定向发生在登录后,并且在该重定向上发送了正确的 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
4

1 回答 1

3

您正在使用两种不同的测试工具,它们不共享会话状态。

您正在使用的visitfill_inclick_button方法通过 capybara 和 rack-test: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,因为 capybara 旨在通过用户界面与实际用户一样与站点交互。我假设您正在测试一个带有 JavaScript API 的丰富 UI。

如果是这种情况,我会结合使用两种测试方法:

  • capybara 规范通过用户界面导航,从不直接访问 API。这些规范可以使用登录时生成的会话。
  • 控制器规范直接命中 API 以快速测试边缘情况和条件。这些规范可以将会话直接传递给控制器​​或使用模拟框架来存根验证。
于 2013-04-26T19:49:11.103 回答