Как создать spe c для метода области видимости модели? - PullRequest
1 голос
/ 08 апреля 2020

У меня есть метод области действия в модели оценки, который я вызываю в 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_at и updated_at из результата.

app / models /valuation.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 /valuation_spe c .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

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Я решил эту проблему:

Assessment.with_assessment_progresses(customer.id).as_json

И я удаляю метки времени, используя:

object.each{ |h| h.delete("updated_at") && h.delete("created_at")}
0 голосов
/ 08 апреля 2020

Вы используете

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

created_at и updatet_at взяты из assessements.*, эти столбцы автоматически генерируются для активных моделей записей. Если вам нужны только определенные значения, просто выберите только те

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