简体   繁体   中英

Test many associations from a single model in Ruby on Rails using RSpec

I have a User model and a Project model.

Users can create many projects, while a project has one owner and can have many members.

#app/models/user.rb
class User < ApplicationRecord
    has_secure_password
    has_many :projects
    has_and_belongs_to_many :projects
end

#app/models/project.rb
class Project < ApplicationRecord
    belongs_to :user
    has_and_belongs_to_many :users
end

And this will create a database tables something like this:

create_table "projects", force: :cascade do |t|
    t.string "name"
    t.integer "user_id" #id of the owner of the projects
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_projects_on_user_id"
  end

  create_table "projects_users", force: :cascade do |t|
    t.integer "user_id" #id of the member of the project
    t.integer "project_id" #project that the member joined
    t.index ["project_id"], name: "index_projects_users_on_project_id"
    t.index ["user_id"], name: "index_projects_users_on_user_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "first_name"
    t.string "last_name"
    t.string "email"
    t.string "password_digest"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

Where the projects_users table is the junction/bridge table created for has_and_belongs_to_many association.

But whenever I run a test using rspec and shoulda only one of them succeeds the other one fails since in the user.rb file :projects are defined twice.

#spec/models/user_spec.rb
require 'rails_helper'
RSpec.describe User, :type => :model do
      context 'associations' do
        it { should have_many(:projects) } #error
        it { should have_and_belong_to_many(:projects) } #success
      end
    end

The error is Failure/Error: it { should have_many(:projects) } Expected User to have a has_many association called projects (actual association type was has_and_belongs_to_many)

#spec/models/project_spec.rb
require 'rails_helper'

RSpec.describe Project, :type => :model do
  context 'associations' do
    it { should belong_to(:user) } #success
    it { should have_and_belong_to_many(:users) } #success
  end
end

How can I test many associations in one model correctly?

As per the description shared , I was able to test has_many using the below mentioned snippet:

RSpec.describe User, :type => :model do
  context 'associations' do
   it "should have many projects" do
     subject { described_class.new }
     assc = described_class.reflect_on_association(:projects)
     expect(assc.macro).to eq :has_many
   end
 end
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM