Тестирование интеграции веб-приложения в Facebook с Cucumber - PullRequest
9 голосов
/ 16 марта 2011

Я бы хотел использовать Cucumber с Capybara, чтобы протестировать процедуру регистрации моего приложения Rails на Facebook, выполнив следующий сценарий:

@javascript
Scenario: Connect account
  When I go to the home page
  And I press "Connect your Facebook account"
  And I fill in "test@address" for "Email"
  And I fill in "test" for "Password"
  And I press "Login"
  And I press "Allow"
  Then I should be on the dashboard page

Как люди подходят к проблеме интеграционного тестирования интеграции с Facebook на основе браузера? Поисковый запрос в Интернете выявляет только пару постов в блоге, которые предшествуют API графа, и они, похоже, обсуждают лишь реализацию предварительного условия, которое устанавливает среду, представляющую пользователя, уже вошедшего в Facebook.

Некоторые конкретные вопросы для решения:

Как имитировать нажатие на элемент <fb:login-button>? Лучшее, что я придумал (но еще не протестировал), - это вручную запустить событие click для элемента.

Как только появляется диалоговое окно Facebook, имеет ли Capybara доступ к нему? Как? Это необходимо для ввода адреса электронной почты и пароля тестовой учетной записи Facebook и установки приложения Facebook для тестовой учетной записи.

Кстати, как управлять тестовыми аккаунтами? http://developers.facebook.com/docs/test_users/ указывает, что тестовых пользователей можно создавать и удалять с помощью Graph API, но API не стремится предоставить доступ к адресу электронной почты или паролю для тестовой учетной записи, что делает их бесполезными для тестирования этот конкретный поток.

Я уверен, что пропускаю и другие важные вопросы. Мне действительно любопытно, как другие люди напали на эту проблему!

Ответы [ 2 ]

13 голосов
/ 30 апреля 2011

В настоящее время я использую гем omniauth для обработки этого типа аутентификации. FBML устарел, поэтому я предлагаю перейти к JS SDK для взаимодействия с FB на стороне клиента. В любом случае, если вы используете omniauth, вы можете относительно легко заглушить ответ, указав несколько тегов Before в папке env, например:

Конфиг Успешный случай:

Before('@omniauth_test_success') do
  OmniAuth.config.test_mode = true

  OmniAuth.config.mock_auth[:facebook] = {
    "provider"  => "facebook",
    "uid"       => '12345',
    "user_info" => {
      "email" => "email@email.com",
      "first_name" => "John",
      "last_name"  => "Doe",
      "name"       => "John Doe"
      # any other attributes you want to stub out for testing
    }
  }
end

Неисправность конфигурации

Before('@omniauth_test_failure') do
  OmniAuth.config.test_mode = true
  [:default, :facebook, :twitter].each do |service|
    OmniAuth.config.mock_auth[service] = :invalid_credentials
    # or whatever status code you want to stub
  end
end

Кукс Характеристика

Scenario: A user unsuccessfully signs in with their email/password
    Given I am on the homepage
    When I follow "Login"
    And I "unsuccessfully" sign in with email and pass
    Then I should see "Failed."

@omniauth_test_success
  Scenario: A user successfully signs in with Facebook
    Given I am on the homepage
    And I follow "Login"
    When I follow "facebook"
    Then I should see "Login successful."

@omniauth_test_failure
  Scenario: A user unsuccessfully signs in with Facebook
    Given I am on the homepage
    And I follow "Login"
    When I follow "facebook"
    Then I should see "Failed."
2 голосов
/ 15 июля 2011

Мне удалось заставить это работать в спецификации приема rspec со следующим кодом:

https://gist.github.com/1084767

Это использует mogli для создания и уничтожения тестовых пользователей и capybara для организации теста браузера. Я считаю, что вы могли бы заставить его работать с Cucumber, удалив блок shared_context и используя Cucumber до / после хуков, например:

Before '@fb_test_user' do
  @fb_user = create_test_user(installed: false)
end

After '@fb_test_user' do
  @fb_user.destroy
end

World(FacebookIntegrationHelpers) 
...