Ruby on Rails - Rspec 3.8, Rails 5, тест перенаправления FacotryBot POST - PullRequest
0 голосов
/ 23 ноября 2018

Я следую учебному пособию по Ruby on Rails, найденному здесь: http://rubyonrailstutor.github.io/. Прежде всего мне пришлось внести некоторые изменения, в основном методом проб и ошибок и поиска ошибок в Интернете.Во многом это связано с тем, что это старое руководство по старой версии Ruby и Rails.

Я использую рельсы 5.2.1 и Ruby 2.5.3, а также последнюю версию большинства драгоценных камней.Я успешно завершил урок до последнего rspec теста, найденного здесь: http://rubyonrailstutor.github.io/new/restaurants-new-create/.

Когда я запускаю rspec spec/requests/restaurants_spec.rb, я получаю следующую ошибку:

Failures:

  1) RestaurantsController POST /restaurants complete params redirects to show
     Failure/Error: expect(subject).to redirect_to restaurant_path(id:1)

       Expected response to be a redirect to <http://www.example.com/restaurants/1> but was a redirect to <http://www.example.com/restaurants/new>.
       Expected "http://www.example.com/restaurants/1" to be === "http://www.example.com/restaurants/new".
     # ./spec/requests/restaurant_spec.rb:32:in `block (4 levels) in <top (required)>'

Finished in 0.60375 seconds (files took 1.47 seconds to load)
5 examples, 1 failure

Failed examples:

rspec ./spec/requests/restaurant_spec.rb:31 # RestaurantsController POST /restaurants complete params redirects to show

Мой контроллерто же, что и то, что использует автор учебника: https://github.com/rubyonrailstutor/restaurantly/blob/restaurants-new/app/controllers/restaurants_controller.rb.

Часть моего файла спецификации, которая не работает:

context "POST /restaurants" do
    context "complete params" do
      subject{ post "/restaurants", params: { name: "mcrails"}}
      it "redirects to show" do
        expect(subject).to redirect_to restaurant_path(id:1)
      end 
    end 

    context "incomplete params" do
      subject{ post "/restaurants", {}} 
      it "redirects to new" do
        expect(subject).to redirect_to(new_restaurant_path)
      end 
    end 
  end 

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

restaurant = {restaurant: {name: "mcrails"}}
subject{ post "/restaurants", restaurant }

Что я изменил на это:

subject{ post "/restaurants", params: { name: "mcrails"}}

Файл спецификации автора на рельсах 4: https://github.com/rubyonrailstutor/restaurantly/blob/restaurants-new/spec/requests/restaurant_spec.rb.

Когда яя запускаю веб-сервер и создаю новый элемент, который он перенаправляет, чтобы # показать элемент должным образом.Однако тест rspec не проходит.Поэтому я считаю, что я не выполняю тест должным образом.Возможно из-за разницы версий и параметров, которые я передаю, но я не могу понять это.Мой опыт работы с Rails на данный момент минимален.

1 Ответ

0 голосов
/ 24 ноября 2018

@ MarkMerritt указал мне на документацию, которая помогла мне с методом проб и ошибок выяснить, как заставить его работать.

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

context "POST /restaurants" do
    context "complete params" do
      subject { post "/restaurants", :params => { :restaurant => { :name => "mcrails" } } } 

      it "redirects to show" do
        expect(subject).to redirect_to restaurant_path(:id => assigns(:restaurant).id) 
      end 
    end 

    context "incomplete params" do
      subject { post "/restaurants", :params => {} } 

      it "redirects to new" do
        expect(subject).to redirect_to(new_restaurant_path) 
      end 
    end 
  end
...