Ruby on Rails 5,Rspec 3.8,测试环境销毁功能充当show功能

时间:2018-11-25 21:53:40

标签: ruby-on-rails rspec-rails puma

每当我遇到正在使用的Rails版本4和Rails版本5之间的版本(主要是语法)问题时,我都遵循restaurantly Rails教程。

完成本教程this页上的步骤后,我认为在测试销毁功能失败后,这是另一个语法差异。

rspec spec/features/restaurants_spec.rb

Capybara starting Puma...
* Version 3.12.0 , codename: Llamas in Pajamas
* Min threads: 0, max threads: 4
* Listening on tcp://127.0.0.1:41471
.F

Failures:

  1) destroy links work displays Restaurantly Spots!
     Failure/Error: expect(page).to have_no_content 'mc ruby'
       expected not to find text "mc ruby" in "mc ruby"
     # ./spec/features/restaurants_spec.rb:27:in `block (3 levels) in <top (required)>'

Finished in 7.25 seconds (files took 2.24 seconds to load)
2 examples, 1 failure

Failed examples:

rspec ./spec/features/restaurants_spec.rb:20 # destroy links work displays Restaurantly Spots!

我运行了puma -e 'test'以在“测试”环境和浏览器中手动运行该应用程序,以亲自执行控制器操作。我发现我也有同样的失败行为。我所有定义的动作,包括createeditupdateshow都按预期工作。但是destroy的行为类似于show,只是显示了该商品的显示页面,或者重定向到根目录并删除了该商品。

如果我在包括rails server函数在内的“开发”环境中运行destroy,所有这些工作将按预期进行。

这里有一些应用程序的不同部分,以防万一:

app/controllers/restaurants_controller.rb:



    def destroy
        @restaurant = Restaurant.find_by_id params[:id]
        @restaurant.destroy
        redirect_to root_path
      end

app/views/restaurants/index.html.haml

.row
  .large-8.columns.large-centered
  %h3.subheader.center
    Restaurantly Spots!

.row
  .large-8-columns.large-centered
    - @restaurants.each do |restaurant|
      %h5.subheader
        = restaurant.name
        = link_to "edit", edit_restaurant_path(restaurant)
        = link_to "destroy", restaurant_path(restaurant), method: :destroy

我的Gemfile的一部分,其中包括开发,测试gem:

group :test, :development do
  gem 'rspec-rails'
  gem 'factory_bot_rails'
  gem 'capybara'
  gem 'pry'
  gem 'pry-byebug'
end

我一次将测试数据库删除,然后再次创建它。我用与创建原始数据库和开发数据库相同的方法来执行此操作,方法是先运行bundle exec rake db:create,然后运行bundle exec rake db:migrate,最后运行bundle exec rake db:test:prepare

config/database.yml

development:
  adapter: postgresql
  encoding: unicode
  database: restaurantly_dev
  pool: 5
  host: ""
  timeout: 5432


test:
  adapter: postgresql
  encoding: unicode
  database: restaurantly_test
  pool: 5
  host: ""
  timeout: 5432

有什么想法为什么它在开发和测试环境之间的破坏功能表现得不同?

1 个答案:

答案 0 :(得分:0)

感谢@arieljuod指出,当方法应该为common_names <- Reduce(intersect, list(names(vec1), names(vec2), names(vec3))) vec1[common_names] + vec2[common_names] + vec3[common_names] # X25 X58 X79 X212 X311 X422 X536 X899 X1080 X1322 X1516 X1705 X1890 # 66 69 72 81 84 87 90 93 99 105 108 111 114 时,我将方法设为:destroy。我可能是在故障排除过程中偶然添加的,所以我不能一直说这是问题所在。尤其是因为删除功能在开发环境而不是测试环境中起作用。但是,在进行了之前从未见过的更改之后,我遇到了路由错误,并且仍在尝试:delete而不是POST

我读了这个answer,发现删除// = require jquery2 DELETE // = require jquery_ujs and application.css`文件后,两者似乎都可以正常工作生产和测试。我不知道为什么在那里,或者为什么它可以解决问题。我的功能测试现在也通过了。