Условные тесты в Rspec? - PullRequest
       3

Условные тесты в Rspec?

3 голосов
/ 14 октября 2011

Есть ли способ условно сгруппировать тесты с помощью rspec?Под этим я подразумеваю, есть ли способ сказать: «Если эта переменная является некоторым значением, запустите этот набор тестов. Если эта переменная является какой-то другой переменной, запустите этот другой набор тестов»?

Базовый примергде это было бы необходимо (на самом деле не работает, очевидно, но должно показать вам, что я хочу).Предположим, что тестируемый пользователь определен в другом месте, а текущий тестируемый пользователь - @user.Хотя у вас могут быть лучшие альтернативы этому, это нормально.

before do 
  login_as_user(@user) #This logs them in and brings them to the homepage to be tested
  page.visit("/homepage")
end
describe "Check the user homepage"
  subject {page}
  it {should have_content("Welcome, #{@user.name}!")}
  if(@user.role=="admin")
    it {should have_link("List Users"}
  end
end

Имейте в виду, что я не контролирую тестируемого пользователя - например, я не могу создавать пользователей на лету, и ни один из них негарантированно существует, и я не знаю, какова будет комбинация ролей данного пользователя.Поэтому мне нужен какой-то способ сказать «запускать этот тест, только если эти условия соблюдены», а не способ создавать ситуации, в которых можно выполнить каждый тест.

Ответы [ 3 ]

2 голосов
/ 14 октября 2011

Вы можете использовать let (или, возможно, let!), чтобы определить, кем должен быть пользователь, вошедший в систему. (Очевидно, замените @regular_user & @admin_user на соответствующий завод / крепеж / и т. Д.)

before do
  login_as_user(user)
  page.visit "/homepage"
end
let(:user) { @regular_user }

describe "Check the user homepage" do
  subject { page }
  it { should have_content "Welcome, #{@user.name}!" }

  context "when an administrator" do
    let(:user) { @admin_user }
    it { should have_link "List Users" }
  end
end
1 голос
/ 29 октября 2011

Хорошо, очевидно, проблема была такой простой: @user - это переменная экземпляра, которая существует только во время выполнения тестов. По этой причине динамическая генерация тестов не работает с переменными экземпляра.

Однако, объявив ее как локальную переменную где-то вне каких-либо блоков тестового стиля (до, после, или укажите), вы можете получить к ней доступ для условной логики.

Решение было так же просто, как снять знак @ с передней панели пользователя.

0 голосов
/ 09 сентября 2013

В той же идее вы можете использовать статические переменные

Чтобы легко переключаться между средами, я даже использую системные глобальные переменные

в моем spec_helper.rb, у меня естьустановить настройки по умолчанию

default_env = {
  'SITE_ROOT' => "http://localhost:3000",
  'ACCOUNT_ID' => 'user',
  'ACCOUNT_PASSWORD' => 'password',
  'SUBMIT_REAL_MONEY' => 'false'
}

# setting default env variables if no ENV ones exists
default_env.each do |const_name, value|
  val = ENV[const_name].nil? ? value : ENV[const_name]
  eval_str = "#{const_name}='#{val}'"
  puts eval_str
  eval eval_str
end

Затем я могу указать свои настройки в командной строке, вызвав мои спецификации:

SITE_ROOT='https://my.production.site/' SUBMIT_REAL_MONEY=true rspec

И вот спецификация за простым условием:

if SUBMIT_REAL_MONEY == 'true'
  it { should respond_with 200 }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...