rspec - 在使用名称空间时将路由路由到错误的控制器,但有时仅

时间:2017-12-04 14:49:48

标签: ruby-on-rails rspec routes namespaces capybara

请耐心等待,在发布此内容之前,我已尝试了很多其他内容,而且我不确定您需要什么才能帮助我。请告诉我,我会更新代码。

我遇到了随机失败规范的问题,因此我使用rspec运行--bisect命令以找出规范失败的原因。 似乎如果按特定顺序运行2个规格,则规格失败。

我正在运行的命令是:

be rspec './spec/features/scheduling/scheduler_spec.rb[1:3:1,1:3:2:1,1:3:2:2:1,1:3:2:2:2,1:3:3,1:3:4,1:3:5,1:3:6]' './spec/requests/api/v1/shifts_spec.rb[1:1:2]' --seed 16251

路由引擎似乎认为以下链接应转到Api::ShifsController,而应该转到ShiftsController

= link_to new_shift_path(date: date.to_date, user_id: user.try(:id)), remote: true do
    = fa_icon "plus fw"

路线:

Rails.application.routes.draw do
  root 'landing_page#index'
  ..
  resources :shifts, only: [:new, :create, :destroy]
  # API
  namespace :api, defaults: { format: 'json' } do
    scope :v1 do
      resources :locations, only: [:index] do
        resources :shifts, only: [:index]
      end
    end
  end

的Gemfile:

ruby '2.4.1'
..
gem 'rails', '~> 5.0.2'
gem 'capybara', '~> 2.16'
gem 'selenium-webdriver', '~> 3.7.0'
..

我得到的错误是:

Failure/Error: raise ActionNotFound, "The action '#{action}' could not be found for #{self.class.name}"
AbstractController::ActionNotFound:
The action 'new' could not be found for Api::ShiftsController

请注意!这有时仅在运行规范时发生。它永远不会发生在开发或生产中。好吧,我还没有经历过。 如果我从路径文件中注释掉行resources :shifts, only: [:new, :create, :destroy],一切都会恢复正常。 我不知道该怎么办。

1 个答案:

答案 0 :(得分:1)

这可能是由于Rails自动加载在ShiftsController和AP​​I :: ShiftsController(或Shifts和API :: Shifts模型,如果存在)之间混淆,这取决于在测试中首先使用哪个,然后认为它不需要加载另一个。要解决这个问题,需要在规范文件顶部的每个规范中使用特定的控制器和/或模型定义文件。

像这样:

# spec/features/scheduling/scheduler_spec.rb
require "#{Rails.root}/app/controllers/shifts_controller"

# spec/features/api/shifts_spec.rb
require "#{Rails.root}/app/controllers/api/shifts_controller"