Как проверить сообщения в Rails / Capybara / Cucumber или Rspec - PullRequest
12 голосов
/ 24 февраля 2011

Я использую rspec, cucumber и capybara и ищу способ проверить, что злонамеренный пользователь не может взломать форму, а затем опубликовать URL-адрес, на который у него / нее нет разрешения.У меня настроены права доступа в cancan, так что это «должно» работать, но единственный способ проверить это - взломать форму самостоятельно.

Как я могу автоматизировать такого рода тестирование?С webrat я мог бы сделать это в модульном тесте с rspec с чем-то вроде

put :update, :user_id => @user.id, :id => @user_achievement.id
response.should contain("Error, you don't have permission to access that!") 

В капибаре, однако, посещение только делает это похоже.Я не могу найти способ сделать это, я гуглил везде.

Любая помощь будет высоко ценится, спасибо

Ответы [ 2 ]

8 голосов
/ 25 февраля 2011

Я думаю, что вы можете сделать это с помощью теста стойки https://github.com/brynary/rack-test

в вашем Gemfile:

gem 'rack-test'

в файле env.rb

module CapybaraApp
  def app; Capybara.app; end
end
World(CapybaraApp)
World(Rack::Test::Methods)

определения шагов где-то:

When /^I send a POST request to "([^"]*)"$/ do |path|
  post path
end

Большая часть того, что я узнал, пришла отсюда: http://www.anthonyeden.com/2010/11/testing-rest-apis-with-cucumber-and-rack-test

ОБНОВЛЕНИЕ: Я думаю, что вы можете пропустить изменения в вашем файле env.rb с более новыми версиямиRails и / или Cucumber (не уверен, что, я просто не делаю эту часть в моих новых проектах, и она отлично работает)

2 голосов
/ 02 мая 2012

То же, что и @Josh Crews. Я в основном основывался на этом: http://www.anthonyeden.com/2010/11/testing-rest-apis-with-cucumber-and-rack-test/#comment-159. Но есть два заметных исключения: 1) я проверяю фактическое тело ответа, 2) демонстрирую, как проверить запрос POST. Вот пример использования Rails 3.0.9:

Шаги:

# features/step_definitions/api_step.feature
When /^I send a GET request to "([^\"]*)"$/ do |url|
  authorize(User.last.email, "cucumber")

  header 'Accept', 'application/json'
  header 'Content-Type', 'application/json'

  get url
end

When /^I send a POST request to "([^\"]*)" with:$/ do |url, body|
  authorize(User.last.email, "cucumber")

  header 'Accept', 'application/json'
  header 'Content-Type', 'application/json'

  post url, body
end

Then /^the JSON response should have (\d+) "([^\"]*)" elements$/ do |number_of_children, name|
  page = JSON.parse(last_response.body)
  page.map { |d| d[name] }.length.should == number_of_children.to_i
end

Then /^I should receive the following JSON response:$/ do |expected_json|
  expected_json = JSON.parse(expected_json)
  response_json = JSON.parse(last_response.body)

  response_json.should == expected_json
end

Then /^I should receive the following JSON object response:$/ do |expected_json|
  expected_json = JSON.parse(expected_json)
  response_json = JSON.parse(last_response.body)

  if expected_json['id'] == 'RESPONSE_ID'
    expected_json['id'] = response_json['id']
  end

  response_json.should == expected_json
end

Характеристика:

# features/api/some_feature.feature
Feature: Users API
  Background:
    Given the following users exist:
      | id | name |
      | 1  | Joe  |
      | 2  | Sue  |
      | 3  | Paul |

  Scenario: Index action
    When I send a GET request to "/users/"
    Then the JSON response should have 3 "user" elements
    And I should receive the following JSON response:
      """
      [
        {
          "id":1,
          "name":"Joe"
        },
        {
          "id":2,
          "name":"Sue"
        },
        {
          "id":3,
          "name":"Paul"
        }
      ]
      """

  Scenario: Create action
    When I send a POST request to "/users/" with:
      """
      {
        "name":"Polly"
      }
      """
    Then I should receive the following JSON object response:
      """
      {
        "id":"RESPONSE_ID",
        "name":"Polly"
      }
      """
    And I send a GET request to "/users/"
    And the JSON response should have 4 "user" elements
...