我有一个在创建时运行的自定义验证:
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在创建时运行验证?谢谢
2条答案
按热度按时间kognpnkq1#
您可能知道这一点,但是
be_foo
匹配器调用foo?
方法并检查它的真实性,因此只会调用
valid?
,并且由于它不会触发对象的创建-因此不会触发验证。你需要做的事情是这样的:
wfsdck302#
这是一个很老的问题,但是@Greg的回答让我找到了正确的方向,他说
be_valid
只是调用valid?
,valid?
接受一个上下文,这个上下文可以用来指定测试哪个回调,例如:类似地,be_valid
将args作为上下文传递给valid?
,因此可以针对运行on: :create
的验证执行be_valid(:create)
。