在 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 (将#修改为@)