我是Rails的新手,我正在尝试查看我的对象以查看值是否为true以验证对象中的所有其他项。如果此人是用户,我当然会在应用程序/模型中验证名称和电子邮件。为此编写规范的最佳方法是什么?
class Members < ActiveRecord::Base
validates_presence_of :email, if: :is_user?
validates_presence_of :first_name, if: :is_user?
validates_presence_of :last_name, if: :is_user?
def is_user?
:is_user
end
end
答案 0 :(得分:2)
您在成员表上有一个名为“is_user”的字段吗?似乎该方法应返回一个布尔值(true或false),而现在它返回一个始终被评估为true的符号,例如,如果你这样做
if :is_user
puts "will always happen" # this will be printed
end
如果数据库上有字段,则无需创建该方法,因为rails会为模型数据库上的所有布尔字段生成带问号的方法。
现在,为了测试您是否可以使用像shoulda_matchers这样的宝石,或者您可以编写自己的测试,例如
describe "validations" do
context "member is a user" do
subject { Member.new(is_user: true) }
it "validates presence of email" do
subject.valid?
expect(subject.errors["email"]).to include("can't be blank")
end
end
context "member is not an user" do
subject { Member.new(is_user: false) }
it "doesn't require fields to have info" do
subject.valid?
expect(subject.errors["email"]).to_not include("can't be blank")
expect(subject.errors["first_name"]).to_not include("can't be blank")
expect(subject.errors["last_name"]).to_not include("can't be blank")
end
end
end
答案 1 :(得分:2)
你应该使用shouda匹配器,它会很整洁:
从此处获取的示例Shoulda/RSpec matchers - conditional validation
context "if user" do
before { subject.stub(:is_user?) { true } }
it { should validate_presence_of(:name) }
it { should validate_presence_of(:email) }
end
context "if not user" do
before { subject.stub(:is_user?) { false } }
it { should_not validate_presence_of(:name) }
it { should validate_presence_of(:email) }
end