Rspec,测试关联的存在

时间:2016-01-25 10:29:01

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

我试图测试一个关联。

我有这两个类:

class Survey < ActiveRecord::Base
  has_many :users, through: :users_surveys
  has_many :users_surveys

  def update_or_create_result(user_id, result, target)
    user_survey = users_surveys.find_or_create_by(user_id: params[:user_id])
    if survey_passed?(result, target)
      user_survey.completed!
    end
  end
end

class User < ActiveRecord::Base
  has_many :surveys, through: :users_surveys
  has_many :users_surveys
end

class UsersSurvey < ActiveRecord::Base
  belongs_to :user
  belongs_to :survey
end

如果创建了调查与用户之间的关联,我如何使用RSpec进行测试?

4 个答案:

答案 0 :(得分:4)

只是想强调一下,RSpec is the following的当前nex语法:

describe User do
  it { is_expected.to have_many(:surveys) } # shortcut for expect(subject).to
end

describe Survey do
  it { is_expected.to belong_to(:user) }
end

should被认为是旧语法已有好几年了:)

答案 1 :(得分:2)

假设您有usersurvey个变量,它就像这样简单:

user.surveys.should include(survey)

由于您的问题有点不清楚,我的答案会检查是否创建了实际两条记录之间的关联。

答案 2 :(得分:2)

shoulda-matchers gem提供了一些漂亮的匹配器来测试声明的关联,并且存在正确的数据库字段和外键:

describe User do
  it { should have_many(:surveys) }
end

如果由于某种原因你有宝石恐惧症,只想直接测试它,你可以使用ActiveRecord::Reflection获取有关模型关系的信息:

describe User do
  it "should have_many :surveys" do
    expect(User.reflect_on_association(:surveys).macro).to eq :has_many
  end
end

describe Survey do
  it "should belong_to user" do
    expect(Survey.reflect_on_association(:user).macro).to eq :belongs_to
    expect(Survey.column_names).to include :user_id
  end
end

您还可以通过创建关联对象来测试模型的行为 - 但是,如果您的验证要求超过规范,有时会因为您的A规范需要满足B的要求而有些混乱。

答案 3 :(得分:1)

如果您正在使用或想要使用Shoulda,这很简单

actions: {
  leaveRoom(user) {
    this.get('leaveRoom')(user);
  }
}

或者,如果您正在测试describe User do it { should have_many(:surveys) } end describe Survey do it { should belong_to(:user) } end ,就像您的情况一样,请使用

has_many :through

如果您不想使用Shoulda,则需要获得一点创意

describe User do
  it { should have_many(:surveys).through(:user_survey) }
end