rspec/rspec-rails

InferredSpecType not working with Rails 8.

Closed this issue · 3 comments

joel commented

The exact same view spec pass with

Ruby version: 3.3.6
Rails version: 7.2.2
RSpec version: 7.1.0

but fails with

Ruby version: 3.3.6
Rails version: 8.0.0
RSpec version: 7.1.0
require "rails_helper"

RSpec.describe "users/new" do
  before do
    assign(:user, User.new(name: "MyString"))
  end

  it "renders new user form" do
    render

    assert_select "form[action=?][method=?]", users_path, "post" do
      assert_select "input[name=?]", "user[name]"
    end
  end
end
 NoMethodError:
       undefined method `assign' for #<RSpec::ExampleGroups::UsersNew0x000000012e4d0150>
joel commented

Okay, it feels the InferredSpecType is failing to do its job, adding type: :view make it works.

require "rails_helper"

RSpec.describe "users/new", type: :view do
  before do
    assign(:user, User.new(name: "MyString"))
  end

  it "renders new user form" do
    render

    assert_select "form[action=?][method=?]", users_path, "post" do
      assert_select "input[name=?]", "user[name]"
    end
  end
end

Is passing

pirj commented

Is this spec generated or hand-written?

With inferring option and turned off, you have to add type metadata.

The cop doesn’t fail, it is marked as unsafe and for a good reason - it has no way to know if inferring is on or off. If inferring is off, disable it immediately the cop, it’s what its doc says.

joel commented

Okay, I see this is a recent change Comment out infer_spec_type_from_file_location! in generated rails_helper.rb, I use a template to set up my rails app, I did not spot that regression. Thanks.