Динамическое тестирование каждого метода в контроллере - PullRequest
2 голосов
/ 09 января 2011

У меня есть Ruby on Rails 3 admin_controller с набором по умолчанию CRUD, index и так далее. Я хотел бы проверить каждое из них для определенных утверждений с rspec .

Как response.should render_template("layouts/some_layout") или тесты, для которых требуется логин.

Копирование-вставка этого теста в группу тестов для каждого метода является большим дублированием. ИМО не имеет смысла иметь

it 'should require login' do

Дублируется несколько раз в течение этого теста.

Есть ли простой способ запустить тест по списку методов? Скажите defined_methods.each do |method| it 'should' .... какой-то?

Это хороший способ, во-первых? Или я выбираю неправильный маршрут?

Ответы [ 3 ]

2 голосов
/ 09 января 2011

Учитывая, что вы действительно хотите все эти утверждения, вы рассмотрели общие примеры групп ?

shared_examples_for "an action that requires authentication" do
  it "should render successfuly" do
    sign_in(user)
    response.should be_success # or whatever
  end

  it "should deny access" do
    # don't sign_in the user
    # assert access was denied
  end
end

shared_examples_for "another behaviour" do
  # ...
end

let(:user) { create_user }

describe "#index" do
  before(:each) { get :index }
  it_behaves_like "an action that requires authentication"
  it_behaves_like "another behaviour"
end

describe "#show" do
  before(:each) { get :show }
  it_behaves_like "an action that requires authentication"
end

# ...

Конечно, прежде чем писать большое количество спецификаций для базовой функциональности, вы всегда должны проверятьесли он еще не проверен библиотекой, предоставляющей функциональность (например, проверка визуализированного шаблона, если он обрабатывается неявным рендерингом rails, может быть немного излишним).

1 голос
/ 09 января 2011

Если вы хотите пойти по пути итеративного тестирования каждого открытого метода в контроллере, вы можете сделать что-то вроде:

SomeController.public_instance_methods(false).each do |method|
  it "should do something"
end

Однако я думаю, что общая группа примеров (см. Примерно на полпути вниз по этой странице: http://rspec.info/documentation/) будет красивее. Если бы она была извлечена, чтобы ее можно было использовать во всех спецификациях вашего контроллера, она будет лучше ..

shared_examples_for "admin actions" do
  it "should require login"
end

Тогда в каждом контроллере спецификация:

describe SomeController do
  it_should_behave_like "admin actions"
end
0 голосов
/ 09 января 2011

Просто добавьте его в свой test_helper.rb, например:

def require_login ... end

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...