2013-03-19 6 views
0

Я новичок в Ruby/рельсов и делать turorial мне было интересно, как я мог бы решить мою маленькую проблему ...рубин рельсов создать have_list_of_links утилита для RSpec теста

У меня есть описать «с действительной информацией», который проверяет, что должно или не должно произойти, когда пользователь запишет действующую информацию. В этой процедуре я хочу убедиться, что некоторые ссылки существуют на новой странице. В Tuto, есть только 2 ссылки, так что мы делаем это так:

it { should have_link('Profile', href: user_path(user)) } 
it { should have_link('Sign out', href: signout_path) } 

Но что, если мы скажем, 10 ссылок? Я думаю, было бы легче иметь помощника нет? Но я не могу понять, как это написать. Это то, что я пришел с ...

затем в $ PROJECT// поддержка/utilities.rb файла спецификации, я определить новые * have_list_of_links * функция:

RSpec::Matchers.define :have_list_of_links do |lol| 
    match do |page| 
    lol.each_pair do |label, link| 
       page.should have_link(label, href: link) 
    end 
    end 
end 

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

Спасибо.

+0

Что вы подразумеваете под ** Я знаю, что это неправильный способ сделать **, взглянув на код, который он должен работать, и делать то, что вы ожидаете. Вы получаете какие-либо ошибки? Единственный побочный эффект, который я вижу, заключается в том, что все ссылки будут запускаться в одном примере, и это может быть плохо для документации. – Kocur4d

+0

На самом деле я не знаю, правильно ли это сделать, это больше того, что я хотел сказать ... – jon

+0

У меня есть сообщение об ошибке, мне просто нужно подождать до конца рабочего дня, чтобы скопировать/вставить его Вот. Я не уверен, хотя, если я понимаю побочный эффект, который вы упоминаете. Не могли бы вы рекомендовать этот способ проведения тестов? Но в любом случае, в конце концов, моя цель состоит в том, чтобы попрактиковаться только в некоторых строках кода, не записанных в туто. – jon

ответ

1

Существует две небольшие проблемы, которые я вижу здесь. Сначала используйте let синтаксис для определения memoized переменных внутри rspec. Во-вторых, скопируйте скобки вокруг * _path помощники при создании вашего хеша.

Так InstEd:

lol = Hash[ 'Profile' => 'user_path(user)', 
      'Sign out' => 'signin_path'] 

есть:

let(:lol) { Hash[ 'Profile' => user_path(user), 
        'Sign out' => signin_path] } 

Ваше описание блока может быть:

describe "with valid information" do 
    let(:lol) { Hash[ 'Profile' => user_path(user), 
        'Sign out' => signin_path] } 

    it { should have_list_of_links(lol) } 
end 

С побочного эффекта я покажу вам небольшой пример. Учитывая, что у вас есть определитель, определенный в $ PROJECT/spec/support/utilities.rb файл, маршруты приложений и т. Д. ... настроены правильно, и у вас есть ссылки в вашем представлении.

describe "Users pages" do 
    before { visit root_path } 
    let(:values) { Hash['Index' => users_path, 
         'Sign out' => signout_path, 
         'Sign in' => signin_path] } 

    subject { page } 

    describe "with valid informations" do 
    it { should have_list_of_links(values) } 
    end 
end 

работает RSpec:

> rspec 
. 

Finished in 0.00267 seconds 
1 example, 0 failures 

Randomized with seed 67346 

работает RSpec документация -f

>rspec -f documentation 
Users pages 
    with valid informations 
    should have link "Sign in" 

Finished in 0.00049 seconds 
1 example, 0 failures 

Randomized with seed 53331 

Это не ясно, и вводит в заблуждение, особенно переключатель документации. Это обычная практика для запуска rspec -f документации по новому приложению. Вы просто положили руки (если они используют rspec ofc). Чтобы лучше понять, что происходит.

Если вы вместо этого:

describe "Users pages" do 
    before { visit root_path } 

    subject { page } 

    describe "with valid informations" do 
    it { should have_link('Index', href: users_path) } 
    it { should have_link('Sign out', href: signout_path) } 
    it { should have_link('Sign in', href: signout_path) } 
    end 
end 

работает RSpec:

>rspec 
... 

Finished in 0.0097 seconds 
3 examples, 0 failures 

Randomized with seed 53347 

работает Rspec -F ДОКУМЕНТАЦИЯ

>rspec -f documentation 
Users pages 
    with valid informations 
    should have link "Index" 
    should have link "Sign out" 
    should have link "Sign in" 

Finished in 0.00542 seconds 
3 examples, 0 failures 

Randomized with seed 40120 

Я лично, как второй случай (более многословный). Его значение увеличивается, когда число тестов растет, а тестовые структуры усложняются. Вы можете просто запустить rspec -f documentation, чтобы узнать, как использовать приложение, даже не заходя в руководство пользователя/учебник.

+0

супер, спасибо за курс крушения! Я проведу ваше решение сегодня вечером и поделись результатами. Еще один вопрос: действительно ли RSpec и поведение управляются программированием, используемым в веб-компаниях, или это более идеальный способ сделать это? – jon

+0

Хорошие тесты компаний, плохие компании не тестируют. То, что они тестируют (RSpec/Minitest/другие фреймворки), является лишь личным вкусом. Если бы я сказал, ** Rspec и BDD ** - это «ЛУЧШИЙ», и вы должны использовать его над ** UnitTest и TDD ** половина людей, читающих этот вопрос, распинает меня, а другая половина купит мне напиток :) линия - на самом деле не имеет значения, что вы тестируете. Просто тест :). – Kocur4d

+0

ОК, еще раз спасибо за информацию, мои вещи сейчас работают. Я также нашел довольно похожую статью http://stackoverflow.com/questions/11916962/how-to-keep-rspec-tests-dry-with-lots-of-have-link?rq=1 , которая слегка раскрывает представление другой. Наверное, мне нужно продолжить эксперименты, и я обязательно вернусь сюда в нескольких. ciao – jon