Вместо того, чтобы тестировать все это в функциональном тесте, я бы использовал функциональные тесты и функции Cucumber в комбинации. Вы хотите проверить, что когда пользователь входит в систему, он может получить доступ к различным частям приложения. Это особенность огурца. Затем вы хотите проверить, что, когда пользователь не вошел в систему, он не может получить доступ к этим частям. Это функциональный тест.
Я бы написал функцию огурца следующим образом:
Feature: Viewing accounts
In order to update my account information
As a user
I want to access my profile page
Background:
Given a user exists:
| login | password |
| Radar | superpassword |
And I am logged in as them
Scenario: My profile page
When I follow "Account"
Then I should see "Profile Information"
Я предполагаю пару вещей здесь. Сначала ваши пользователи авторизуются, используя логин и пароль. У вас может быть это как электронная почта и пароль, но я уверен, что вы понимаете суть.
Шаг "Я вошел в систему как они" на самом деле не устанавливает сеанс, а фактически проходит процесс входа в систему пользователя. Я хотел бы написать эти два шага фона, как это *:
Given /^a user exists:$/ do |table|
table.hashes.each do |user|
@user = User.create!(user)
end
end
Given /^I am logged in as them$/ do
steps(%Q{
Given I am on the homepage
And I follow "Login"
And I fill in "Login" with "#{@user.login}"
And I fill in "Password" with "#{@user.password}"
And I press "Login"
Then I should see "Login successful."
})
end
С этими шагами будет определен сценарий. Здесь я предполагаю, что у вас есть ссылка где-то на странице, где действие входа в систему перенаправляет на сообщение «Аккаунт». Когда эта ссылка нажата, я также предполагаю, что она переходит на страницу с надписью «Информация профиля».
* Это немного надуманный пример. Шаг «пользователь существует» может занимать несколько строк.
Теперь для функционального теста. Я парень из RSpec, поэтому я бы написал так.
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
describe AccountsController do
context "not logged in users" do
it "cannot access the profile action" do
get :profile
flash[:alert].should eql("You must be logged in to access that action.")
response.should redirect_to(login_path)
end
end
end
before_filter
, который проверяет, что пользователь вошел в систему, будет проверен этим функциональным тестом. Поскольку это метод private
(это метод private
, верно?), Его не следует тестировать напрямую. Здесь я снова делаю пару предположений, например, что когда этот before_filter
"терпит неудачу", он устанавливает flash[:alert]
для определенного сообщения и перенаправляет на login_path
.
Итак, подведем итоги: протестируйте все, что пользователь может делать, щелкая и заполняя формы на сайте, используя Cucumber, но для таких вещей, как переход к защищенным действиям или отсутствующим ресурсам, используйте функциональную проверку / спецификацию контроллера. *