【问题标题】:How to create spec for model scope method?如何为模型范围方法创建规范?
【发布时间】:2020-04-08 13:56:51
【问题描述】:

我在评估模型中有范围方法,我在评估集合中调用了 AssessmentsController,但我无法为此方法创建测试,因为: 1) 作为回应,我没有得到 risk_value,但在控制器 (@assessments.with_assessment_progresses(@customer_id)) 中我得到了这个:

[
  {
    "id": 4,
    "name": "Assessment_1",
    "created_at": "2020-04-01T17:29:50.528Z",
    "updated_at": "2020-04-01T17:29:50.528Z",
    "risk_value": "3.92156862745098"
  },
  ...
]

2) 我不明白如何从结果中删除 created_atupdated_at

app/models/assessment.rb

scope :with_assessment_progresses, ->(customer_id) {
  joins(Arel.sql("LEFT JOIN assessment_progresses ON (assessment_progresses.assessment_id = assessments.id AND assessment_progresses.customer_id = #{customer_id})")).
  select("assessments.*, assessment_progresses.risk_value")
}

spec/models/assessment_spec.rb

describe "Method 'with_assessment_progresses'" do
  let!(:admin)                     { create(:admin) }
    let!(:customer)                { create(:customer, created_by: admin.id) }
  let!(:assessment)                { create(:assessment) }
    let!(:assessment_progress_1)   { create(:assessment_progress, customer_id: customer.id, assessment_id: assessment.id, risk_value: 3.812) }

  it "return assessments with risk_value for customer" do
    assessment_with_risk = Assessment.with_assessment_progresses(customer.id)

    assessment_with_risk.delete("created_at")
    assessment_with_risk.delete("updated_at")

    expect(assessment_with_risk.length).to eq(1)
    expect(assessment_with_risk).to eq(
      [
        {
          "id"=> assessment.id,
          "name"=> assessment.name,
          "risk_value"=> assessment_progress_1.risk_value
        }
      ]
    )

  end
end

【问题讨论】:

    标签: ruby-on-rails ruby api rspec


    【解决方案1】:

    你使用

    .select("assessments.*, assessment_progresses.risk_value")
    

    created_atupdatet_at 来自assessements.*,这些列会自动为活动记录模型生成。如果您只想要某些值,只需选择那些

    .select("assessments.id, assessments.name ,assessment_progresses.risk_value")
    

    【讨论】:

    • 我需要响应 created_at 和 updated_at,但在 rspec 中我需要删除它们
    • @Ants_soo 很高兴你知道了。但是,为什么要在测试之前删除规范中的元素。如果您不想测试它们,那么最好只检查值是否包含在您想要的位置,请参阅relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/…
    【解决方案2】:

    我解决了这个问题:

    Assessment.with_assessment_progresses(customer.id).as_json
    

    我使用以下方法删除时间戳:

    object.each{ |h| h.delete("updated_at") && h.delete("created_at")}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多