首页 > 解决方案 > 整数模型属性在 assert_equal 调用中转换为字符串

问题描述

当我使用 assert_equal 检查整数模型属性的值时,返回的值是一个字符串。

我正在运行集成测试,在其中更新模型实例,然后检查模型实例以确保值已更改。

数据库表:

create_table :launches do |t|
  ...
  t.integer :result
  ...

  t.timestamps
end

模型:

validates :result, presence: true, numericality: { only_integer: true, greater_than: 0 }

这是测试:

@launch.reload
assert_equal 2, @launch.result

它会产生这个错误:

test_edit_a_launch#LaunchesNewAndEditTest (0.99s)
    Expected: 2
      Actual: "2"
    test/integration/launches_new_and_edit_test.rb:57:in `block in <class:LaunchesNewAndEditTest>'

这些值作为字符串返回,并且与整数的比较失败。如果我将测试更改为:

@launch.reload
assert_equal 2, @launch.result.to_i

有用。但这没有任何意义,它应该将模型中的整数值与整数预期结果进行比较。当我在 rails 控制台中操作对象时,该值是一个整数。

标签: ruby-on-railsruby-on-rails-5

解决方案


问题是测试数据库和开发数据库(都是 PostgreSQL)不同步。“结果”列最初是“字符变量”。在开发过程中,我在一次迁移中将其更改为整数列并运行它。由于某种原因,迁移没有在测试数据库上运行。

为了修复它,我运行了以下命令:

rails db:reset RAILS_ENV=test

推荐阅读