如何解决在 Rails 中测试 PG 约束
使用 Rails 6.0.3.4、Minitest、PG、Ruby 2.7.2
我在我的 Rails 项目中创建了一个迁移,它在我的服务模型中引入了约束。
ALTER TABLE services
ADD CONSTRAINT version CHECK (
CASE WHEN version = 1 AND id != original_service_id then FALSE
WHEN version != 1 AND id = original_service_id then FALSE
WHEN version != 1 AND deprecated_since IS NULL then FALSE
WHEN version =1 AND deprecated_since IS NOT NULL then FALSE
END
);
成功执行 rails db:migrate 后,我使用 rails 控制台“手动”测试 CONSTRAINT,我得到了预期的行为。引发异常。
控制台输入:
Forge::Service.insert(specialty_id: 1,name: "a",description: "a",created_at: Time.now,updated_at: Time.now,version: 2)
控制台输出:
ActiveRecord::StatementInvalid: PG::CheckViolation: ERROR: new row for relation "services" violates check constraint "version" DETAIL: Failing row contains (71,a,f,2,null,1,2021-02-13 18:46:43.635609,2021-02-13 18:46:43.635614).
然后我创建了一个测试来确认行为,但我无法重现相同的结果。
test "cannot insert to db with invalid version" do
assert_raise(Exception) do
Forge::Service.insert(specialty_id: 1,version: 2)
end
end
测试产生以下结果。
Failure:
Forge::ServiceTest#test_cannot_insert_to_db_with_invalid_version [/home/francis/code/s21385/bumble-z/test/models/forge/service_test.rb:129]:
Exception expected but nothing was raised.
rails test test/models/forge/service_test.rb:128
我在测试前后都使用了 Service.count,并且有效地创建了一个新记录,因此很明显我的 PG CONSTRAINT 在测试时没有应用。
我尝试删除 RAILS_ENV=test db 并加载它,但我遇到了同样的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。