gpt4 book ai didi

ruby-on-rails - Cucumber Stories 的 session 变量

转载 作者:行者123 更新时间:2023-11-28 19:40:26 24 4
gpt4 key购买 nike

我正在为一个包含多个步骤的“注册”应用程序编写一些 Cucumber 故事。

与其写一个 Huuuuuuuge 故事来一次涵盖所有步骤,这将不好,我宁愿像普通用户一样完成 Controller 中的每个操作。我的问题是,我将在第一步中创建的帐户 ID 存储为 session 变量,因此当访问第 2 步、第 3 步等时,会加载现有的注册数据。

我知道能够在 RSpec 规范中访问 controller.session[..] 但是当我尝试在 Cucumber 故事中这样做时它失败并出现以下错误(并且,我'我也在某处读到这是一个反模式等...):

使用 controller.session[:whatever] 或 session[:whatever]

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.session (NoMethodError)

使用 session(:whatever)

wrong number of arguments (1 for 0) (ArgumentError)

所以,似乎加入 session 存储是不可能的。我想知道是否有可能(我想哪个最好..):

  1. 模拟 session 存储等
  2. 在 Controller 中有一个方法并将其 stub (例如 get_registration 分配一个实例变量...)

我已经浏览了 RSpec 书(嗯,略读)并浏览了 WebRat 等,但我还没有真正找到我的问题的答案......

为了更清楚一点,注册过程更像是一个状态机 - 例如用户在注册完成之前完成了四个步骤 - 因此“登录”并不是一个真正的选项(它打破了网站工作的模型)...

在我的 Controller 规范中,我能够将对基于 session var 加载模型的方法的调用 stub - 但我不确定“反模式”行是否也适用于 stub 和模拟?

谢谢!

最佳答案

我将重复 danpickett 所说的在 Cucumber 中应尽可能避免模拟。但是如果你的应用没有登录页面,或者性能有问题,那么可能需要直接模拟登录。

这是一个丑陋的 hack,但它应该可以完成工作。

Given /^I am logged in as "(.*)"$/ do |email|
@current_user = Factory(:user, :email => email)
cookies[:stub_user_id] = @current_user.id
end

# in application controller
class ApplicationController < ActionController::Base
if Rails.env.test?
prepend_before_filter :stub_current_user
def stub_current_user
session[:user_id] = cookies[:stub_user_id] if cookies[:stub_user_id]
end
end
end

关于ruby-on-rails - Cucumber Stories 的 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1271788/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com