我试图测试一个关联。
我有这两个类:
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进行测试?
答案 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)
假设您有user
和survey
个变量,它就像这样简单:
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