ruby-on-rails - 检查 RSpec 中仅在创建时运行的自定义验证
问题描述
我有一个在创建时运行的自定义验证:
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 在创建时运行验证?谢谢
解决方案
你可能知道这一点,但是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
推荐阅读
- c# - 如何在 C# 表单中创建一个文本框,以便用户可以选择一个单元格
- python - Python 遗传算法:修改类以区分性别
- angular - 如何使用 Angular 在 ngClass 中使用函数和表达式?
- android - 在 Android 上使用 MVI 更新部分 UI
- arcgis - ArcGIS Javascript 4.x 添加带有要素图层的状态边界
- python - Databricks 正在“更新 Delta 表的状态”
- oracle - KUP-04020:使用 DBMS_CLOUD 加载数据时发现记录长于支持的缓冲区大小错误
- reactjs - 网格中的 cellRenderer 在 columnDef 中更改 cellRenderer 时不会改变
- ios - 如何在 iPhone 存储中隐藏 iOS 应用程序的文档和数据
- r - 如何在R中创建字符串组合