Ruby on Rails 5.2: напишите rspec для контроллера при использовании нескольких вложенных моделей - PullRequest
0 голосов
/ 28 августа 2018

У меня есть курсы, каждый курс имеет массив сегментов. Каждый сегмент содержит атрибут типа. Если тип - викторина, то сегмент также содержит массив вопросов. это пример запроса JSON для всех курсов:

[
  {
    id: 1,
    title: "Angular",
    author: "Dana",
    segments: [
      {
        id: 1,
        unit_id: 1,
        unit_title: "Introduction",
        name: "Lesson 1: Basic Stuff",
        segment_type: "Video",
        data: "https://www.angular.com/vid1.flv"
      },
      {
        id: 2,
        unit_id: 1,
        unit_title: "Introduction",
        name: "Quiz",
        segment_type: "Quiz",
        questions: [
          {
            id: 1,
            question: "Question 1",
            answer1: "Answer1",
            answer2: "Answer2",
            answer3: "Answer3",
            answer4: "Answer4",
            correct: 3
          },
          {
            id: 2,
            question: "Question2",
            answer1: "Answer1",
            answer2: "Answer2",
            answer3: "Answer3",
            answer4: "Answer4",
            correct: 2
          },
          {
            id: 3,
            question: "Question3",
            answer1: "Answer1",
            answer2: "Answer2",
            answer3: "Answer3",
            answer4: "Answer4",
            correct: 4
          }
        ]
      }
    ]
  },
  {
    id: 2,
    title: "Ruby on Rails",
    author: "Dana",
    segments: [ ]
  }
]

Я начал писать спецификацию для контроллера, но я не знаю, как ссылаться на вложенные данные внутри курса. Я не нашел в Google ничего полезного это контроллер и спецификации, которые я написал:

контроллер

  describe "GET #show" do
    before do
      get :show, id: course.id
    end

    let(:course) {Course.create(title: "Test", author: "Ofir is The Best")}

    it "returns http success" do
      expect(response).to have_http_status(:success)
    end

    it "response with JSON body containing expected Course attributes" do
      hash_body = nil
      expect { hash_body = JSON.parse(response.body).with_indifferent_access }.not_to raise_exception
      expect(hash_body.keys).to match_array([:id, :title, :author])
      expect(hash_body).to match({
        id: course.id,
        title: 'Test',
        author: 'Ofir is The Best'
      })
    end
  end

спецификация контроллера

  describe "GET #show" do
    before do
      get :show, id: course.id
    end

    let(:course) {Course.create(title: "Test", author: "Ofir is The Best")}

    it "returns http success" do
      expect(response).to have_http_status(:success)
    end

    it "response with JSON body containing expected Course attributes" do
      hash_body = nil
      expect { hash_body = JSON.parse(response.body).with_indifferent_access }.not_to raise_exception
      expect(hash_body.keys).to match_array([:id, :title, :author])
      expect(hash_body).to match({
        id: course.id,
        title: 'Test',
        author: 'Ofir is The Best'
      })
    end
  end
...