Rails 4模型rspec for if条件

时间:2014-12-09 14:32:07

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

我是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

2 个答案:

答案 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