Как высушить тесты RSpec, используемые разными действиями в одном контроллере - PullRequest
1 голос
/ 10 июня 2011

У меня есть следующие тесты, которые я хочу протестировать из различных действий в одном контроллере. Как я могу высушить это? В комментариях ниже вы увидите, что тест должен вызывать другой метод и действие в зависимости от того, какое действие я тестирую.

shared_examples_for "preparing for edit partial" do

  it "creates a new staff vacation" do
    StaffVacation.should_receive(:new)
    get :new
  end

  it "assigns @first_day_of_week" do
    get :new
    assigns(:first_day_of_week).should == 1
  end

end


describe "GET new" do
  # i want to use 'it_behaves_like "preparing for edit partial"'
  # and it should use 'get :new'
end

describe "GET edit" do
  # i want to use 'it_behaves_like "preparing for edit partial"'
  # but it should use 'get :edit' instead
end

describe "POST create" do
  # on unsuccessful save, i want to use 'it_behaves_like "preparing for edit partial"'
  # but it should use 'post :create' instead
end

Ответы [ 2 ]

3 голосов
/ 10 июня 2011

Вы можете сделать что-то вроде этого:

shared_examples_for "preparing for edit partial" do
  let(:action){ get :new }

  it "creates a new staff vacation" do
    StaffVacation.should_receive(:new)
    action
  end

  it "assigns @first_day_of_week" do
    action
    assigns(:first_day_of_week).should == 1
  end
end

context 'GET new' do
  it_should_behave_like 'preparing for edit partial' do
    let(:action){ get :new }
  end
end

context 'GET edit' do
  it_should_behave_like 'preparing for edit partial' do
    let(:action){ get :edit }
  end
end

context 'POST create' do
  it_should_behave_like 'preparing for edit partial' do
    let(:action){ post :create }
  end
end

Или, вы можете использовать какой-то цикл для примеров:

['get :new', 'get :edit', 'post :create'].each do |action|
  context action do
    it "creates a new staff vacation" do
      StaffVacation.should_receive(:new)
      eval(action)
    end

    it "assigns @first_day_of_week" do
      eval(action)
      assigns(:first_day_of_week).should == 1
    end
  end
end
1 голос
/ 22 сентября 2011

Один из вариантов может заключаться в том, чтобы обеспечить модуль модулем, в котором есть ваша спецификация.

include Auth # This is your module with your generalized spec inside a method

it "redirects without authentication" do
  unauthorized_redirect("get", "new")
end

Тогда, в нашем методе, мы могли бы сделать цикл через различные типы авторизации:

module Auth
  def unauthorized_redirect(request, action)
    [nil, :viewer, :editor].each do |a| 
      with_user(a) do
        eval "#{request} :#{action}"
        response.should redirect_to login_path
        # whatever other expectations
      end
    end 
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...