2012-04-06 5 views
0

У меня есть запрос спецификации, которая выглядит следующим образом:Лучший способ написать эту спецификацию запроса?

describe "Registering from the main page" do 
    before(:each) do 
    fill_in "username","my_username" 
    fill_in "password","my_password" 
    fill_in "password_confirmation","my_password" 
    click_button "Register" 
    end 

    it "should have created a new user" do 
    User.count.should == 1 
    end 

    it "should have changed the message on the homepage" do 
    find("#element").value.should == "You registered!" 
    end 

    # ... other tests like this 
end 

Первый вопрос, как я могу убедиться, что у меня есть 0 пользователей перед отправкой формы?

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

ОБНОВЛЕНИЕ: Я изменил before(:all) на before(:each), потому что тесты начали сбой. Тело ответа кажется неполным, когда я использую before(:all). Вы случайно не знаете, почему?

ответ

1

Вы можете можете использовать change() Искателя, чтобы не беспокоиться о том, что отсчет заранее:

lambda { click_button("Register") }.should change{ User.count }.by(1) 

Если вы действительно хотите, чтобы конкретно перейти от 0 до 1, вы можете сделать это :

lambda { click_button("Register") }.should change{ User.count }.from(0).to(1) 

Чтобы ответить на вопрос о before(:all) и before(:each), before(:each) будет вызываться один раз перед каждым (например it блока), в то время как before(:all) получает имя только один раз перед всеми примерами в блоке describe. Вот почему before(:all) обычно не рекомендуется, поскольку, если какой-либо из ваших примеров изменит что-то о начальном состоянии, это повлияет на последующие примеры.

+0

Что о том, что это в 'до (: каждый)' блок? Есть ли способ вытащить его оттуда? – Geo

+0

Кроме строки 'click_button" Register "', я думаю, что код находится в нужном месте. Это подготовка для тестирования регистрации, и, похоже, она должна быть там для всех ваших примеров, поэтому 'before (: each)' is good. – tsherif

+0

Также добавлено что-то, чтобы обратиться к вопросу 'before (: all)'/'before (: each)'. – tsherif

Смежные вопросы