ruby-on-rails 检查RSpec中仅在创建时运行的自定义验证

s71maibg  于 2023-02-01  发布在  Ruby
关注(0)|答案(2)|浏览(172)

我有一个在创建时运行的自定义验证:

validate :validate_emails, if: :send_email, on: :create

在我的规范中,我这样做:

describe "#validate_emails" do
  let(:box_shared_link_2) { BoxSharedLink.new(box_file, link_type: "view", email: "john@doe.com jane@doe.com;johny@doe.com") }
  let(:invalid_box_shared_link) { BoxSharedLink.new(box_file, link_type: "view", email: "john jane;johny@doe.com", send_email: "Update and Send Link") }

  it "should be invalid" do
    expect(invalid_box_shared_link).to_not be_valid
  end

  it "should be valid" do
    expect(box_shared_link_2).to be_valid
  end
end

我如何告诉RSpec在创建时运行验证?谢谢

kognpnkq

kognpnkq1#

您可能知道这一点,但是be_foo匹配器调用foo?方法并检查它的真实性,因此

it "should be invalid" do
    expect(invalid_box_shared_link).to_not be_valid
  end

只会调用valid?,并且由于它不会触发对象的创建-因此不会触发验证。
你需要做的事情是这样的:

it "should be invalid" do
    expect(invalid_box_shared_link.save).to eq(false) # saving failed
    expect(invalid_box_shared_ling.errors).not_to be_empty # saving failed because of validation errors
    # you might also want to check the actual error, like
    expect(invalid_box_shared_ling.errors).to include(emails: 'validation error message') # I'm guessing what actually the array would include
  end
wfsdck30

wfsdck302#

这是一个很老的问题,但是@Greg的回答让我找到了正确的方向,他说be_valid只是调用valid?valid?接受一个上下文,这个上下文可以用来指定测试哪个回调,例如:类似地,be_valid将args作为上下文传递给valid?,因此可以针对运行on: :create的验证执行be_valid(:create)

it "should be invalid" do
    expect(invalid_box_shared_link).to_not be_valid(:create)
  end

  it "should be valid" do
    expect(box_shared_link_2).to be_valid(:create)
  end

相关问题