2012-06-27 2 views
31

Я только что узнал, насколько крутой RSpec и Cabybara, и теперь он работает над этим, чтобы научиться писать фактический тест.Перенаправление тестирования с RSpec и Capybara (Rails)

Я пытаюсь проверить, есть ли переадресация на конкретную страницу после нажатия ссылки. Ниже приведен сценарий

 

1) I have a page /projects/list 
     - I have an anchor with html "Back" and it links to /projects/show 

Below is the test i wrote in rspec 

describe "Sample" do 
    describe "GET /projects/list" do 
    it "sample test" do 
     visit "/projects/list" 
     click_link "Back" 
     assert_redirected_to "/projects/show" 
    end 
    end 
end 

тест завершается с сообщением отказа, как показано ниже

 
    Failure/Error: assert_redirected_to "/projects/show" 
    ArgumentError: 
     @request must be an ActionDispatch::Request 

Пожалуйста, предложите мне о том, как я должен проверить переадресацию и что я делаю неправильно?

ответ

68

Попробуйте current_path.should == "/projects/show"

Капибара также реализует метод current_url для полностью квалифицированного URL.

Дополнительная информация в docs.

+3

может быть лучше использовать' projects_path'? И, возможно, также использовать нотацию 'ожидать', пока вы на ней находитесь – SuckerForMayhem

-2

Вы должны использовать маршрут, что-то вроде:

assert_redirected_to projects_path 

, а не

assert_redirected_to "/projects/show" 
+0

Когда я использую как 'assert_redirected_to projects_path' он показывает, как' неопределенному локальной переменной или метода 'projects_path» для # ' – balanv

+0

вам нужно project_show_path, в этом случае –

4

От Devise wiki:

В Rails, когда приложение стойки переадресовывает (так же, как Warden/Devise перенаправляет вас на страницу входа в систему), ответ не будет соответствующим образом обновлен сеансом интеграции. Как следствие, помощник assert_redirected_to не будет работать.

Кроме того, эта страница имеет ту же информацию: Rspec make sure we ended up at correct path

Так что вам нужно, чтобы проверить, что вы теперь на этот URL, а не тест, который вы будете перенаправлены на него.

10

Я не уверен, что это может быть то, что вам нужно, но в моих тестах я предпочитаю такой подход:

... 
subject { page } 
... 
before do 
    visit some_path_path 
    # do anything else you need to be redirected 
end 
it "should redirect to some other page" do 
    expect(page.current_path).to eq some_other_page_path 
end 
+0

' page.current_path' не нужно, вы можете использовать только 'current_path', так как вы уже объявили' page' объектом – mitra

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