Повторные описания тестов с RSpec для каждой роли пользователя

Создавая несколько тестов контроллера с помощью RSpec, я повторяю несколько тестов для каждой возможной роли пользователя.

Например

describe "GET 'index'" do
  context "for admin user" do
    login_user("admin")

    it "has the right title" do
      response.should have_selector("title", :content => "the title")
    end
  end

  context "for regular user" do
    login_user("user")

    it "has the right title" do
      response.should have_selector("title", :content => "the title")
    end
  end
end

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

Есть ли способ написать тесты только один раз, а затем запускать их в разных контекстах?


person Marcos Crispino    schedule 13.01.2011    source источник


Ответы (3)


describe "GET 'index'" do
  User::ROLES.each do |role|
    context "for #{role} user" do
      login_user(role)

      it "has the right title" do
        response.should have_selector("title", :content => "the title")
      end
    end
  end
end

Вы можете использовать итераторы ruby ​​в своих спецификациях. Учитывая вашу конкретную реализацию, вам придется скорректировать код, но это даст вам правильную идею для DRY'ing ваших спецификаций.

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

person George Anderson    schedule 13.01.2011
comment
На самом деле я проголосовал за ответ shared_examples, но после некоторого использования rspec я предпочитаю этот более простой/понятный подход. - person Dty; 04.02.2017

Общие примеры являются более гибким подходом к этому:

shared_examples_for "titled" do
  it "has the right title" do
    response.should have_selector("title", :content => "the title")
  end
end

И в примере

describe "GET 'index'" do
  context "for admin user" do
    login_user("admin")
    it_behaves_like "titled"
  end
end

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

person zetetic    schedule 14.01.2011

Попробуйте использовать общие примеры групп

http://relishapp.com/rspec/rspec-core/v/2-4/dir/example-groups/shared-example-group

person monocle    schedule 13.01.2011