Спецификация контроллера RSpec действует как спецификация запроса

  • Рельсы 5.0.0.rc1
  • rspec-core@a99ff26
  • rspec-rails@052206f

У меня есть спецификация контроллера, которая выглядит примерно так:

require "rails_helper"

RSpec.describe InquiriesController, type: :controller do
  describe "#create" do
    let(:inquiry_attributes) { attributes_for(:inquiry) }

    before do
      post :create, inquiry: inquiry_attributes
    end

    it "whatever" do
      expect(2).to be 2
    end
  end
end

Он находится в файле spec/controllers/inquiries_controller_spec.rb, поэтому RSpec не должен делать вывод, что это спецификация запроса на основе его местоположения.

Когда я запускаю эту спецификацию, я получаю следующую ошибку:

1) InquiriesController#create whatever
   Failure/Error: post :create, inquiry: inquiry_attributes

   URI::InvalidURIError:
     bad URI(is not URI?): create
     # /Users/spetryk/.gem/ruby/2.3.1/gems/rack-test-0.6.3/lib/rack/test.rb:193:in `env_for'
     # /Users/spetryk/.gem/ruby/2.3.1/gems/rack-test-0.6.3/lib/rack/test.rb:66:in `post'

Хм, похоже, что post исходит из Rack. Не уверен, почему. Вот мои spec_helper и rails_helper:

spec_helper.rb

RSpec.configure do |config|
  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end

  config.filter_run focus: true
  config.run_all_when_everything_filtered = true
end

rails_helper.rb

ENV["RAILS_ENV"] ||= "test"
require File.expand_path("../../config/environment", __FILE__)

abort("The Rails environment is running in production mode!") if Rails.env.production?

require "spec_helper"
require "rspec/rails"
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.use_transactional_fixtures = true

  # Yes, I've tried removing this line
  config.infer_spec_type_from_file_location!

  config.filter_rails_from_backtrace!

  config.include Rails.application.routes.url_helpers
  config.include FactoryGirl::Syntax::Methods
end

Мой InquiriesController находится в app/controllers/inquiries_controller.rb, не находится под модулем, и маршрут подключен правильно (я проверил это, посетив его вручную и убедившись, что он работает). Метод действительно называется create, и я успешно проделал это с другими проектами.


person Steven Petryk    schedule 23.05.2016    source источник
comment
Возможно, стоит отметить, что изменение :create на /inquiries делает спецификацию пройденной.   -  person Steven Petryk    schedule 23.05.2016
comment
Вы можете принять свой собственный ответ через 48 часов. См. stackoverflow.com/help/self-answer.   -  person Holger Just    schedule 23.05.2016
comment
@HolgerJust Я знаю, но я хотел, чтобы люди не тратили время на просмотр этого :)   -  person Steven Petryk    schedule 23.05.2016


Ответы (1)


Я узнал, что происходит. Я бездумно скопировал стандарт компании spec_helper, который включал Rack::Test::Methods, внедрив Rack-методы во все свои тесты.

person Steven Petryk    schedule 23.05.2016