Rails:黄瓜和应用程序控制器方法

时间:2018-03-06 02:56:16

标签: ruby-on-rails ruby rspec cucumber

我正在使用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,但如果我开始添加更多用户,这可能无法正常工作。

有解决方法吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你并没有真正按照这里的意图使用黄瓜。你正在做的是测试你的应用程序当前是如何工作的,但是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更适合这种情况。