【问题标题】:Test many associations from a single model in Ruby on Rails using RSpec使用 RSpec 在 Ruby on Rails 中测试来自单个模型的多个关联
【发布时间】:2018-06-18 05:03:34
【问题描述】:

我有一个用户模型和一个项目模型。

用户可以创建多个项目,而一个项目只有一个所有者并且可以有多个成员。

#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

这将创建一个类似这样的数据库表:

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

projects_users 表是为has_and_belongs_to_many 关联创建的联结/桥接表。

但是每当我使用 rspec 运行测试并且应该只有其中一个成功时,另一个失败,因为在 user.rb 文件中 :projects 被定义了两次。

#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

错误是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

如何正确测试一个模型中的多个关联?

【问题讨论】:

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


    【解决方案1】:

    根据共享的描述,我能够使用下面提到的 sn-p 测试 has_many:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      相关资源
      最近更新 更多