2012-01-19 4 views
1

Я решил написать некоторые спецификации запроса, в дополнение к моим сценариям огурца. Но не удалось на моем первом примере:Rails request spec не делает запрос на отправку

Так есть этот способ положить в мой goalsController:

def achieve 
     @goal.update_attribute(:achieved, true) 
     redirect_to :back 
    end 

И это пример:

# -*- coding: utf-8 -*- 
require 'spec_helper' 

describe "Achievements" do 
    before(:all) do 
    @bob = Factory(:user, :email => "[email protected]", :password => "qweqwe", :password_confirmation => "qweqwe", :money => 500) 
    @achieve = Factory(:goal, :user => @bob, :title => "Notebook", :price => 100, :achieved => false) 
    login_user('[email protected]', 'qweqwe') 
    end 
    it 'can not be achieved twice' do 
     visit dashboard_path 
     put achieve_user_goal_path(@bob, @achieve) #Passes it well 
     @achieve.reload #same with or without this line 
     @achieve.achieved.should equal true #Fails 
    end 
end 

Таким образом, после поместить запрос «достичь» поле становится истинным , Он отлично работает в моем приложении и на этапе огурца, но не в этом примере rspec. Это похоже на то, что rspec просто игнорирует строку с «put».

ответ

0

Если я понимаю, как это работает правильно, RSpec использует помощники Test :: Unit из Rails. Если вы читаете имя контроллера из того, что вы описываете, вам нужно будет describe AchievementsController, а не только некоторую строку. Вы не заходите на страницу, а затем отправляете put, вы просто описываете контроллер и отправляете put.

При этом, если вы используете помощники по интеграции интеграции capybara, вспомогательные помощники блока, такие как put и get, вероятно, не делают то, что вы хотите, поскольку они будут выполняться вне контекста драйвера браузера. Вы должны проинструктировать Capybara щелкнуть нужную ссылку или кнопку (или выполнить любое действие, которое выполняет пользователь).

+0

Я хочу проверить, что все работает правильно, если пользователь пытается снова запросить эту возможность. Например, если он открыл две одинаковые страницы и пытается нажать «Достичь» на обоих из них. –

+0

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

+0

При следующем посещении этого пути этой кнопки не будет, потому что цель достигнута. Но если ранее пользователь открыл другую страницу, тогда у нее появится эта кнопка, и пользователь снова сможет ее щелкнуть. Мой код уже безопасен для этого поведения (я вставил не весь код из действия #achieve), и я просто хочу проверить его с запросом spec :) –

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