0

First its based on Rails 3 on Action so, i will type every thing i have tried and the errors I have got so anybody can help me and if there any important file i should added to my question please tell...also maybe the title of the question not good enough but i don't know what title should i give to cucumber questions.

In the book the author was trying to hide edit and delete links so non-signed user and signed in user won't be able to see it except they are admins.

for authentication he is using devise 1.4.3 and cucumber version 1.0.6, i am on chapter 7 specifically on 7.3.3.

Now the steps in the book said we will wirte a cucumber test for hiding edit and delete links and that was the code of it: hidden_links.feature

Scenario: Edit project link is hidden for non-signed-in users
  Given I am on the homepage
  When I follow "TextMate 2"
  Then I should not see the "Edit Project" link

Scenario: Edit project link is hidden for signed-in user
  Given I am signed in as "user@ticketee.com"
  When I follow "TextMate 2"
  Then I should not see the "Edit Project" link

Scenario: Edit project link is shown to admin
  Given I am signed in as "admin@ticketee.com"
  When I follow "TextMate 2"
  Then I should see the "Edit Proeject" link

Scenario: Delete project link is hidden for non-signed-in users
  Given I am on the homepage
  When I follow "TextMate 2"
  Then I should not see the "Delete Project" link

Scenario: Delete project link is hidden for signed-in users
  Given I am signed in as "user@ticketee.com"
  When I follow "TextMate 2"
  Then I should not see the "Delete Project" link

Scenario: Delete project link is shown to admins
  Given I am signed in as "admin@ticketee.com"
  When I follow "TextMate 2"
  Then I should see the "Delete Project" link

then when tried to run the test i got a problem about missing feature (although in the book the test is passing and then should be pushed to github but for me it not passing ) so i have added this at the top of my code:

Feature: Hidden Links
  In order to clean up the user experience
  As the system
  I want to hide links from users who can't act on them

Now when i am trying to run the test i am getting this error:

➜  ticketee git:(master) ✗ bin/cucumber features/hidden_links.feature
Rack::File headers parameter replaces cache_control after Rack 1.5.
Using the default profile...
Feature: Hidden Links
  In order to clean up the user experience
  As the system
  I want to hide links from users who can't act on them

  Scenario: Edit project link is hidden for non-signed-in users # features/hidden_links.feature:6
    Given I am on the homepage                                  # features/step_definitions/web_steps.rb:44
    When I follow "TextMate 2"                                  # features/step_definitions/web_steps.rb:56
      Unable to find link "TextMate 2" (Capybara::ElementNotFound)
      ./features/step_definitions/web_steps.rb:57:in `/^(?:|I )follow "([^"]*)"$/'
      features/hidden_links.feature:8:in `When I follow "TextMate 2"'
    Then I should not see the "Edit Project" link               # features/hidden_links.feature:9
      Undefined step: "I should not see the "Edit Project" link" (Cucumber::Undefined)
      features/hidden_links.feature:9:in `Then I should not see the "Edit Project" link'

  Scenario: Edit project link is hidden for signed-in user # features/hidden_links.feature:11
    Given I am signed in as "user@ticketee.com"            # features/hidden_links.feature:12
      Undefined step: "I am signed in as "user@ticketee.com"" (Cucumber::Undefined)
      features/hidden_links.feature:12:in `Given I am signed in as "user@ticketee.com"'
    When I follow "TextMate 2"                             # features/step_definitions/web_steps.rb:56
    Then I should not see the "Edit Project" link          # features/hidden_links.feature:14
      Undefined step: "I should not see the "Edit Project" link" (Cucumber::Undefined)
      features/hidden_links.feature:14:in `Then I should not see the "Edit Project" link'

  Scenario: Edit project link is shown to admin  # features/hidden_links.feature:16
    Given I am signed in as "admin@ticketee.com" # features/hidden_links.feature:17
      Undefined step: "I am signed in as "admin@ticketee.com"" (Cucumber::Undefined)
      features/hidden_links.feature:17:in `Given I am signed in as "admin@ticketee.com"'
    When I follow "TextMate 2"                   # features/step_definitions/web_steps.rb:56
    Then I should see the "Edit Proeject" link   # features/hidden_links.feature:19
      Undefined step: "I should see the "Edit Proeject" link" (Cucumber::Undefined)
      features/hidden_links.feature:19:in `Then I should see the "Edit Proeject" link'

  Scenario: Delete project link is hidden for non-signed-in users # features/hidden_links.feature:21
    Given I am on the homepage                                    # features/step_definitions/web_steps.rb:44
    When I follow "TextMate 2"                                    # features/step_definitions/web_steps.rb:56
      Unable to find link "TextMate 2" (Capybara::ElementNotFound)
      ./features/step_definitions/web_steps.rb:57:in `/^(?:|I )follow "([^"]*)"$/'
      features/hidden_links.feature:23:in `When I follow "TextMate 2"'
    Then I should not see the "Delete Project" link               # features/hidden_links.feature:24
      Undefined step: "I should not see the "Delete Project" link" (Cucumber::Undefined)
      features/hidden_links.feature:24:in `Then I should not see the "Delete Project" link'

  Scenario: Delete project link is hidden for signed-in users # features/hidden_links.feature:26
    Given I am signed in as "user@ticketee.com"               # features/hidden_links.feature:27
      Undefined step: "I am signed in as "user@ticketee.com"" (Cucumber::Undefined)
      features/hidden_links.feature:27:in `Given I am signed in as "user@ticketee.com"'
    When I follow "TextMate 2"                                # features/step_definitions/web_steps.rb:56
    Then I should not see the "Delete Project" link           # features/hidden_links.feature:29
      Undefined step: "I should not see the "Delete Project" link" (Cucumber::Undefined)
      features/hidden_links.feature:29:in `Then I should not see the "Delete Project" link'

  Scenario: Delete project link is shown to admins # features/hidden_links.feature:31
    Given I am signed in as "admin@ticketee.com"   # features/hidden_links.feature:32
      Undefined step: "I am signed in as "admin@ticketee.com"" (Cucumber::Undefined)
      features/hidden_links.feature:32:in `Given I am signed in as "admin@ticketee.com"'
    When I follow "TextMate 2"                     # features/step_definitions/web_steps.rb:56
    Then I should see the "Delete Project" link    # features/hidden_links.feature:34
      Undefined step: "I should see the "Delete Project" link" (Cucumber::Undefined)
      features/hidden_links.feature:34:in `Then I should see the "Delete Project" link'

Failing Scenarios:
cucumber features/hidden_links.feature:6 # Scenario: Edit project link is hidden for non-signed-in users
cucumber features/hidden_links.feature:21 # Scenario: Delete project link is hidden for non-signed-in users

6 scenarios (2 failed, 4 undefined)
18 steps (2 failed, 4 skipped, 10 undefined, 2 passed)
0m0.187s

You can implement step definitions for undefined steps with these snippets:

Then(/^I should not see the "(.*?)" link$/) do |arg1|
  pending # express the regexp above with the code you wish you had
end

Given(/^I am signed in as "(.*?)"$/) do |arg1|
  pending # express the regexp above with the code you wish you had
end

Then(/^I should see the "(.*?)" link$/) do |arg1|
  pending # express the regexp above with the code you wish you had
end

Then I added this to my code in order to trying to make my test pass:

Background:
  Given there are the following users:
    | email              | password | admin |
    | user@ticketee.com  | password | false |
    | admin@ticketee.com | password | true  |
  And there is a project called "TextMate 2"

Then I run the test and got this error:

➜  ticketee git:(master) ✗ bin/cucumber features/hidden_links.feature
Rack::File headers parameter replaces cache_control after Rack 1.5.
Using the default profile...
Feature: Hidden Links
  In order to clean up the user experience
  As the system
  I want to hide links from users who can't act on them

  Background:                                  # features/hidden_links.feature:6
    Given there are the following users:       # features/step_definitions/user_steps.rb:1
      | email              | password | admin |
      | user@ticketee.com  | password | false |
      | admin@ticketee.com | password | true  |
    And there is a project called "TextMate 2" # features/step_definitions/project_steps.rb:1

  Scenario: Edit project link is hidden for non-signed-in users # features/hidden_links.feature:13
    Given I am on the homepage                                  # features/step_definitions/web_steps.rb:44
    When I follow "TextMate 2"                                  # features/step_definitions/web_steps.rb:56
      undefined method `admins_only' for #<#<Class:0x9c16994>:0x9d134b4> (ActionView::Template::Error)
      ./app/views/projects/show.html.erb:3:in `_app_views_projects_show_html_erb___713092924_82350660'

      ./features/step_definitions/web_steps.rb:57:in `/^(?:|I )follow "([^"]*)"$/'
      features/hidden_links.feature:15:in `When I follow "TextMate 2"'
    Then I should not see the "Edit Project" link               # features/hidden_links.feature:16
      Undefined step: "I should not see the "Edit Project" link" (Cucumber::Undefined)
      features/hidden_links.feature:16:in `Then I should not see the "Edit Project" link'

  Scenario: Edit project link is hidden for signed-in user # features/hidden_links.feature:18
    Given I am signed in as "user@ticketee.com"            # features/hidden_links.feature:19
      Undefined step: "I am signed in as "user@ticketee.com"" (Cucumber::Undefined)
      features/hidden_links.feature:19:in `Given I am signed in as "user@ticketee.com"'
    When I follow "TextMate 2"                             # features/step_definitions/web_steps.rb:56
    Then I should not see the "Edit Project" link          # features/hidden_links.feature:21
      Undefined step: "I should not see the "Edit Project" link" (Cucumber::Undefined)
      features/hidden_links.feature:21:in `Then I should not see the "Edit Project" link'

  Scenario: Edit project link is shown to admin  # features/hidden_links.feature:23
    Given I am signed in as "admin@ticketee.com" # features/hidden_links.feature:24
      Undefined step: "I am signed in as "admin@ticketee.com"" (Cucumber::Undefined)
      features/hidden_links.feature:24:in `Given I am signed in as "admin@ticketee.com"'
    When I follow "TextMate 2"                   # features/step_definitions/web_steps.rb:56
    Then I should see the "Edit Proeject" link   # features/hidden_links.feature:26
      Undefined step: "I should see the "Edit Proeject" link" (Cucumber::Undefined)
      features/hidden_links.feature:26:in `Then I should see the "Edit Proeject" link'

  Scenario: Delete project link is hidden for non-signed-in users # features/hidden_links.feature:28
    Given I am on the homepage                                    # features/step_definitions/web_steps.rb:44
    When I follow "TextMate 2"                                    # features/step_definitions/web_steps.rb:56
      undefined method `admins_only' for #<#<Class:0x9c16994>:0xaa71660> (ActionView::Template::Error)
      ./app/views/projects/show.html.erb:3:in `_app_views_projects_show_html_erb___713092924_82350660'
      /home/dexter/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.12/lib/action_view/template.rb:145:in `block in render'
      ./features/step_definitions/web_steps.rb:57:in `/^(?:|I )follow "([^"]*)"$/'
      features/hidden_links.feature:30:in `When I follow "TextMate 2"'
    Then I should not see the "Delete Project" link               # features/hidden_links.feature:31
      Undefined step: "I should not see the "Delete Project" link" (Cucumber::Undefined)
      features/hidden_links.feature:31:in `Then I should not see the "Delete Project" link'

  Scenario: Delete project link is hidden for signed-in users # features/hidden_links.feature:33
    Given I am signed in as "user@ticketee.com"               # features/hidden_links.feature:34
      Undefined step: "I am signed in as "user@ticketee.com"" (Cucumber::Undefined)
      features/hidden_links.feature:34:in `Given I am signed in as "user@ticketee.com"'
    When I follow "TextMate 2"                                # features/step_definitions/web_steps.rb:56
    Then I should not see the "Delete Project" link           # features/hidden_links.feature:36
      Undefined step: "I should not see the "Delete Project" link" (Cucumber::Undefined)
      features/hidden_links.feature:36:in `Then I should not see the "Delete Project" link'

  Scenario: Delete project link is shown to admins # features/hidden_links.feature:38
    Given I am signed in as "admin@ticketee.com"   # features/hidden_links.feature:39
      Undefined step: "I am signed in as "admin@ticketee.com"" (Cucumber::Undefined)
      features/hidden_links.feature:39:in `Given I am signed in as "admin@ticketee.com"'
    When I follow "TextMate 2"                     # features/step_definitions/web_steps.rb:56
    Then I should see the "Delete Project" link    # features/hidden_links.feature:41
      Undefined step: "I should see the "Delete Project" link" (Cucumber::Undefined)
      features/hidden_links.feature:41:in `Then I should see the "Delete Project" link'

Failing Scenarios:
cucumber features/hidden_links.feature:13 # Scenario: Edit project link is hidden for non-signed-in users
cucumber features/hidden_links.feature:28 # Scenario: Delete project link is hidden for non-signed-in users

6 scenarios (2 failed, 4 undefined)
30 steps (2 failed, 4 skipped, 10 undefined, 14 passed)
0m0.748s

You can implement step definitions for undefined steps with these snippets:

Then(/^I should not see the "(.*?)" link$/) do |arg1|
  pending # express the regexp above with the code you wish you had
end

Given(/^I am signed in as "(.*?)"$/) do |arg1|
  pending # express the regexp above with the code you wish you had
end

Then(/^I should see the "(.*?)" link$/) do |arg1|
  pending # express the regexp above with the code you wish you had
end

and that is the show.html.erb where i have admins_only:

<% title(@project.name, "Projects") %>
<h2><%= @project.name %></h2>
<% admins_only do %>
<%= link_to "Edit Project", edit_project_path(@project) %>
<%= link_to "Delete Project", @project, :method => :delete, :confirm => "Are you sure you want to delete this project?" %>
<% end %>
<%= link_to "New Ticket", new_project_ticket_path(@project) %>
<ul id= 'tickets'>
    <% @project.tickets.each do |ticket| %>
    <li>
        #<%= ticket.id %> - <%= link_to ticket.title, [@project, ticket] %>
    </li>
    <% end %>
</ul>

thats what i have tried but failed to solve my problem so help appreciated...

Mostafa Hussein
  • 11,063
  • 3
  • 36
  • 61

1 Answers1

1

You have not implemented the step definitions in a corresponding _steps.rb file. Web Steps provides some generic step definitions, but they are terrible and you shouldn't use them.

To solve this you need to paste this:

Then(/^I should not see the "(.*?)" link$/) do |arg1|
  pending # express the regexp above with the code you wish you had
end

Given(/^I am signed in as "(.*?)"$/) do |arg1|
  pending # express the regexp above with the code you wish you had
end

Then(/^I should see the "(.*?)" link$/) do |arg1|
  pending # express the regexp above with the code you wish you had
end

into a ruby file inside the step_definitions directory, and replace pending with the code to fulfill the conditions of the step.

DVG
  • 17,392
  • 7
  • 61
  • 88
  • and what about 'pending' word inside the code you have posted ? i don't know what should i add into it. also what about 'admins_only' it said undefined and in the book nothing about defining it what should to be made ? – Mostafa Hussein Aug 31 '13 at 22:51
  • It depends entirely on the project. For a rails app you'll probably use capybara. Something like `page.should_not have_link "my link"` – DVG Aug 31 '13 at 23:41
  • admins_only should probably be defined as a helper method, but that's another question, really. – DVG Aug 31 '13 at 23:41
  • and yes i am using capybara – Mostafa Hussein Sep 01 '13 at 00:02