【问题标题】:Different JSON output in RSpecRSpec 中的不同 JSON 输出
【发布时间】:2016-03-02 18:20:20
【问题描述】:

我正在为仅以 JSON 响应的控制器创建 RSpec 测试文件。 它的工作是将Service对象序列化为JSON对象,效果很好。

当我为控制器创建测试时,我注意到它一直失败,因为响应 JSON 的精度与 Rails 生成的精度不同。

  describe "getting a service detail" do
    it "should succeed when a valid id is supplied" do
      service = create(:service, user: user)

      get( :show, id: service.id, format: :json )
      expect(response).to have_http_status(200)

      result = JSON.parse(response.body)
      expect(result).to_not be_nil

      expect(result).to eq(service.api_json().to_json)
    end
  end

api_json 方法与控制器中使用的方法相同,因此它们应该相等。但是,浮点字段的精度不同:

"latitude":73.1379129975533,"longitude":170.75011612037 # Controller Response
"latitude":73.13791299755334,"longitude":170.75011612037048 # RSpec comparison

这是控制器输出对象的方式:

  def show
    begin
      @service = @api_user.services.includes(task: :address).find(params[:id])

      respond_with @service do |format|
        format.json { render json: @service.api_json }
      end

    rescue ActiveRecord::RecordNotFound
      render nothing: true, status: 404
    end
  end

如您所见,没有什么特别之处:没有任何地方设置精度。

我尝试直接比较响应的正文也无济于事。

请有人指点我正确的方向,好吗?谢谢。

【问题讨论】:

    标签: ruby-on-rails json ruby-on-rails-4 rspec


    【解决方案1】:

    看起来您的数据库以不同的精度存储浮点数 - 在您的规范中,您首先创建一个服务以某种精度分配坐标,然后您正在检查控制器的响应,该控制器正在查询您的数据库以获取给定的服务。您的 DB 修剪浮动,因此您会得到不同精度的响应。

    我认为您有两种可能的解决方案:

    1. 使用工厂创建记录时对属性进行四舍五入
    2. 创建后重新加载您的服务 (service = create(:service, user: user).reload)

    【讨论】:

    • 感谢您的回复,但如果它是相同的记录,数据库如何修剪值?如代码中所述,我首先创建记录,然后通过控制器获取它并将其与自身进行比较。不过,我会尽快尝试您关于重新加载模型的建议。
    • 当你创建一个 ActiveRecord 对象并将它保存在数据库中时,只会重新加载主键(因为它在大多数情况下是由数据库分配的)。您的浮点属性存储在数据库中,数据库的浮点精度可能低于 Ruby 的浮点精度。这就是重新加载记录时值可能不同的原因。
    • 谢谢,这正是问题所在。我现在正在研究 ActiveRecord 验证,以确保 Rails 和 DB 中的精度相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多