Повторные описания тестов с RSpec для каждой роли пользователя - PullRequest
4 голосов
/ 13 января 2011

Создавая некоторые тесты контроллеров с помощью 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

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

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

Ответы [ 3 ]

15 голосов
/ 14 января 2011

Общие примеры - более гибкий подход к этому:

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

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

3 голосов
/ 13 января 2011
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 ​​в своих спецификациях. Учитывая вашу конкретную реализацию, вам придется скорректировать код, но это даст вам правильную идею для СУХОГО прохождения ваших спецификаций.

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

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

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

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

...