Rails测试环境报错:PG::InvalidTextRepresentation数组格式异常
解决PostgreSQL数组字段在Rails测试中的序列化问题
你遇到的问题核心很明确:测试数据给PostgreSQL数组字段cp传递了普通字符串,而PostgreSQL要求数组字面量必须以{开头或包含维度信息,这和测试环境的测试数据构造方式直接相关——开发/生产环境正常是因为业务代码里你肯定是用数组对象赋值的,而测试环节没注意这一点。
下面是具体的排查和解决步骤:
检查测试Fixture文件
打开test/fixtures/cities.yml,看看你是不是把cp字段写成了普通字符串:# 错误写法:把数组字段赋值为单个字符串 sample_city: city: "Barcelona" cp: "08001"要改成YAML的数组格式:
# 正确写法:用YAML数组语法 sample_city: city: "Barcelona" cp: ["08001", "08002"]检查测试代码中的直接赋值
如果你的测试用例里直接创建City对象时传了字符串给cp,比如:test "something about city" do city = City.create(cp: "MyString", name: "Test City") # ... end必须改成传递数组对象:
test "something about city" do city = City.create(cp: ["MyString"], name: "Test City") # ... end检查FactoryBot(如果用了的话)
如果你用FactoryBot生成测试数据,检查工厂定义:# 错误写法 factory :city do cp { "MyString" } # ... end修正为数组:
# 正确写法 factory :city do cp { ["MyString"] } # ... end验证Rails对PostgreSQL数组的原生支持
你提到没在模型里设置serialize :cp, Array,这是完全正确的——Rails针对PostgreSQL的数组类型有原生支持,只要迁移里声明了array: true,模型会自动把数据库的数组映射成Ruby数组,不需要额外序列化配置,所以问题肯定出在测试数据的构造上,而非模型配置。
为什么开发/生产环境没问题?因为在业务流程中,你大概率是通过表单参数或者代码逻辑给cp赋值为数组(比如从用户输入拆分出多个邮编存成数组),而测试环节因为是手动构造数据,不小心传了单个字符串,触发了PostgreSQL的格式校验错误。
内容的提问来源于stack exchange,提问作者Marc Pursals
相关产品推荐
相关产品推荐

