【问题标题】:Rails: Cucumber and Application Controller MethodsRails:黄瓜和应用程序控制器方法
【发布时间】:2018-08-13 19:56:33
【问题描述】:

我正在使用 Cucumber 进行集成测试。在我的ApplicationController 中,我有一个名为current_user 的方法,它提供了当前用户对象。我使用此对象将项目添加到 redis 数据库:

$redis.sadd("cart#current_user.id}", [1,5,2])

在我的 Cucumber 步骤中,我测试了这个功能:

Then /^the redis database should have "(.+)" item ids/ do |count|
  expect($redis.smembers("cart#{current_user.id}").count).to eq count.to_i
end

但是,据我了解,Cucumber 无法访问控制器方法,即使它们位于 ApplicationController 下,因此我无法像在控制器中那样使用 current_user 方法。

我现在正在做的是因为我正在测试功能,所以数据库中只有一个用户,因此 current_user.id 将始终为 1,但如果我开始添加更多用户,这可能无法正常工作。

有解决办法吗?

【问题讨论】:

  • 我想在您的测试套件中的某个时刻,您注册或登录用户。此时,您需要以某种方式获取用户 ID,并将其存储在变量中。

标签: ruby-on-rails ruby rspec cucumber


【解决方案1】:

您有登录步骤吗?如果是这样,您可以稍作更改,以便控制哪些用户登录:

Given "john_doe" logs in to the app

然后您可以按用户名搜索并在您的步骤中进行登录。您可以在此步骤中执行相同操作:

Then /^the redis database should have "(.+)" item ids/ do |count|

类似

Then /^the redis database should have "(.+)" item ids for user "(.*)"/ do |count, user_name|
  user = User.find_by(username: user_name)
  expect($redis.smembers("cart#{user.id}").count).to eq count.to_i
end

【讨论】:

  • 我有单独的测试可以完全按照你的方式进行。但是,如果用户不存在,那么在某些时候(例如,当用户签出时),应用程序会自动将用户登录为访客用户。发生这种情况时,来宾用户的 id 可以是任何随机 id,用户将没有姓名、密码、电子邮件等,但会有一个 id。在我的应用程序中,我可以使用 current_user 方法访问来宾用户的 ID。经过一番挖掘,我发现我没有测试最佳方式,我不需要访问 current_user 方法。感谢您的回复!
【解决方案2】:

您并没有真正按照此处的预期使用 Cucumber。您正在做的是测试您的应用程序当前的工作方式,但实际上,Cukes 最适合用于指定您的应用程序的功能及其重要性。

对您当前的问题应用更适当的用法会导致以下问题

在 Redis 中存储 id 的原因是什么? 存储这些 id 对客户有什么好处?

大胆猜测,您可能正在保存一个购物篮,这样如果用户退出,他们的购物篮仍然会在他们回来时被填充。那么你的场景会是这样的

Scenario: Remember products in basket
  Given I am registered
  And I am logged in
  When I put some products in my basket
  And I log out
  And I log in again
  Then my basket should still have some products in it

请注意这个场景是关于你在做什么以及为什么它很重要,但没有揭示这将如何完成。这是一个批判场景的好方法。包含 HOW 内容的场景将更难编写,也更难维护。无论如何,足够了:)

现在您可以使用标准的黄瓜东西,例如一步将用户分配给变量,例如@i = create_registered_user 然后在其他步骤中使用该用户,例如login as: @i

请注意,我们不查看数据库,只查看用户看到的内容,并且我们不会透露此功能在场景中如何工作的任何信息。

如果您想编写测试(而不是场景)来揭示功能的工作原理并查看数据库以获得结果,那么我建议 rspec 更适合于此。

【讨论】:

  • 谢谢!这真的很有帮助。我仍在思考测试的类型、它们的用途、每个测试使用的工具等。我到了那里:)。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多