如何避免黄瓜特征中的硬编码值?

时间:2011-11-01 19:53:41

标签: ruby-on-rails cucumber

在编写我的场景时,是否可以不必在步骤中硬编码文本?

比如说我在文本框字段中插入用户名,在密码字段中插入密码。

如果我需要在很多地方这样做,那么修复它会很痛苦。

示例:

Given I am the registered member "myusername"
And I am on the login page
When I fill in "email" with "email@example.com"
And I fill in "password" with "123"
And I press "Login"
Then I should see "Account Activity"

我不希望我的用户名,电子邮件和密码是硬编码的。

4 个答案:

答案 0 :(得分:7)

好的,您仍在使用默认安装的训练轮附带的cucumber-rails宝石的旧版本。阅读AslakHellesøy"The training wheels came off"的这篇文章。

帖子的要点是使用web_steps.rb,虽然它已成为年的“标准”现在非常错误,我们应该感觉不好这样做。

Cucumber的目的是使用它为所有人提供可读/可理解的功能。

编写这样的场景很漫长而且很无聊:

And I am on the login page
When I fill in "email" with "email@example.com"
And I fill in "password" with "123"
And I press "Login"
Then I should see "Account Activity"

您希望实际测试的是您应该能够登录并在此之后看到有关登录的内容。无论是什么,都不应该在场景中编写

理想情况下,您的Scenario(以更多令人兴奋的方式)看起来像这样:

When I login successfully
Then I should see that I am logged in

然后,做腿部工作的任务转到一些新的步骤定义。这两个步骤不会像web_steps.rb那样自动为您定义,而是需要将它们写在feature/step_definitions内的文件中。你所说的文件取决于你,但它包含的内容与此类似:

When /I login successfully/ do
  visit root_path
  click_link "Login"
  fill_in "Email", :with => "you@example.com"
  fill_in "Password", :with => "password"
end

Then /^I should see I am logged in$/ do
  page.should have_content("Account Activity")
end 

不再有过多的web_steps.rb文件和更清晰的步骤定义。正是黄瓜应该是什么。

答案 1 :(得分:0)

按照here

所述创建一个封装登录行为的步骤

如果这对您有用,我会建议调整Given /我登录/逐步调入capybara调用以略微提升性能。此外,将来建议您出于here所述的原因避免使用web_steps。

答案 2 :(得分:0)

Ryan的例子是从命令性步骤到声明性的转变。这通常是一个更好的主意。这意味着实现已经转移到步骤定义中,这使得该功能更具可读性,并专注于行为而不是细节。

但是如果你需要特定于你的步骤(命令性),你可以尝试像

这样的东西
Given I am a registered member
And I am on the login page
When I fill in the login form
And I submit the login form
Then I should see I am logged in

您还可以将这些步骤组合起来,使其更简单。但是,在大多数情况下,瑞安的想法可能更好。

编辑:瑞恩写了一本书。这是相当不错。嗨莱恩!

答案 3 :(得分:0)

您可以在数据文件夹下的框架中创建csv文件,将私有值添加到csv文件中,然后在功能文件中调用