当前位置: 首页 > 知识库问答 >
问题:

访问RSpec请求规范中的会话变量

景正文
2023-03-14

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

我不认为在“只是测试移动-登录-页面”的例子中,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

共有1个答案

葛安和
2023-03-14

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

您正在使用的访问fill_inclick_button方法通过水豚和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

如果在第二个示例中使用access而不是get,则从login_user创建的会话将是可见的。

请注意,通常不建议直接使用capybara测试API,因为capybara的设计目的是通过用户界面与站点交互,就像实际用户那样。我假设您正在测试一个富UI,其背后有一个JavaScript API。

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

  • capybara规范通过用户界面导航,从不直接访问API。这些规范可以使用登录时生成的会话
  • 控制器规格直接命中API,以快速测试边缘情况和条件。这些规范可以将会话直接传递给控制器,或者使用模拟框架来取消身份验证
 类似资料:
  • 从WebSocketendpoint,我尝试调用单例服务。但是我无法使用来自WebSocket的请求或会话范围。 谢谢你的帮助!

  • 问题内容: 我想知道是否有一种简单的方法可以从Jade模板中访问Express.js的req或会话变量,而无需通过常规响应传递它。 还是这是唯一的方法? 问题答案: 您需要创建一个Express才能使用。 然后在模板内部,您可以使用或其他任何东西。 注意:Express 3中不推荐使用dynamicHelpers

  • 问题内容: 如果我在Django中设置会话变量,例如: 有什么方法可以从模板中访问它,还是必须从视图中检索它,然后将其传递给模板? 询问是因为我想在模板中访问大约10个小会话变量,然后将所有10个从视图传递到模板可能会有些混乱。 (我必须使用会话变量,因为它是HttpResponseRedirect,但是出于我的目的,将变量存储在数据库中是过大的。) 那么-有什么方法可以直接在模板中获取会话变量?

  • 我可以从控制器规格访问当前用户,没有问题。从Rspec内部。功能规范,我无法使当前用户可用。 我需要当前用户的原因是,我正在测试发送邀请功能。我导航到发送邀请的页面,填写邀请[to_user]字段,然后单击“发送邀请”。我想确保页面上显示正确的flash消息。但是,我正在通过单击“发送邀请”触发的控制器操作中将发送者\u id设置为当前\u用户id,我需要在此处定义当前\u用户。 我设置了支持/控

  • 我已经对Spring bean使用的注释进行了注释。我通过spring DI成功地创建了相同的bean,并设置了对象注入的范围。现在,我想用Struts2和di做同样的事情。为此,我在中创建了bean定义 和简单的操作来创建bean并将其注入到我的操作中 在JSP中,我在会话bean上使用简单的迭代器 null

  • 问题内容: 我在Sun的“ Core Servlets and JavaServer Pages vol 2”中看到了带有会话计数器的示例。 计数器仅仅是建立在和递增/递减会话数与/ : 侦听器在上下文中注册自身,因此可以访问它并获取计数器值。 没有同步块。 安全,不是吗? 可以缓存在CPU寄存器中,并且对于使用? 问题答案: Servlet 3.0的规范规定(第11.5节): 侦听器实例和线程