Как создать тесты RSpec для следующего кода

Мне нужно создать тестирование RSpec для следующего рубинового кода, и, похоже, каждый раз я сталкиваюсь с проблемами. Мне бы хотелось пример или два теста RSpec, которые можно было бы создать для следующего кода/методов, находящихся в моем контроллере:

  def edit
    @movie = Movie.find params[:id]
  end
   def update
    @movie = Movie.find params[:id]
    @movie.update_attributes!(movie_params)
    flash[:notice] = "#{@movie.title} was successfully updated."
    redirect_to movie_path(@movie)
  end
   def destroy
    @movie = Movie.find(params[:id])
    @movie.destroy
    flash[:notice] = "Movie '#{@movie.title}' deleted."
    redirect_to movies_path
  end
   def find_with_same_director
    @movie = Movie.find(params[:id])
    @movies, check_info = Movie.find_with_same_director(params[:id])
    if check_info
      flash[:notice] = "'#{@movie.title}' has no director info"
      redirect_to movies_path
    end
  end

У меня пока так:

RSpec.describe MoviesController, type: :controller do
  it 'should get all movies in the database' do
      get :index
      expect(response).to render_template :index
      expect(assigns[:movies]).to eq(Movie.all)
  end
  describe 'find_with_same_director' do
    it 'should call the find_with_same_director model method' do
      expect(Movie).to receive(:find_with_same_director).with(no_args)
      get :find_with_same_director, id: movie.id
    end
  end
end

но он не покрывает его правильно. Любая помощь будет оценена, спасибо.

я думаю, что власть имущие в мире рельсов рекомендуют людям больше не проводить тесты контроллера, а вместо этого использовать спецификации запросов. что вы имеете в виду, что это не "покрывает это правильно"?

BenKoshy 28.03.2019 04:37

Ну, это для задания, поэтому ничего не могу с этим поделать. Я имею в виду, я думаю, что мой синтаксис для тестов неверен, поскольку они возвращают ошибку, хотя они должны работать.

AJ.N 28.03.2019 04:54

Было бы полезнее, если бы вы могли указать причину сбоя, которую вы получаете.

max pleaner 28.03.2019 06:37

Почему вы не ожидаете никаких аргументов с find_with_same_director? В контроллере вы передаете туда аргумент.

max pleaner 28.03.2019 06:38

Вы правы, я изменил его на with(params[:id]), потому что это то, что я передаю, когда вызываю функцию @maxpleaner

AJ.N 28.03.2019 17:30

так ... это был провал?

max pleaner 28.03.2019 17:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
253
1

Ответы 1

RSpec.describe MoviesController, type: :controller do
 it 'should get all movies in the database' do
    get :index
    expect(response).to render_template :index
    expect(assigns[:movies]).to eq(Movie.all)
 end

 it 'should update movie in the database' do
   Factory.girl.create(:movie)
   before_movie_count = Movie.count

   put :update, id: movie.id

   expect(assigns[:movies]).to eq(...) # whatever data is passed

   expect(Movie.count).to eq(before_ml_count)
   expect(flash[:snack_class]).to eq(:notice.to_s)
   expect(flash[:snack_message]).to ends_with('was successfully updated')
   expect(response).to have_http_status(:redirect)
 end

 it 'should delete movie in the database' do
    Factory.girl.create(:movie)
    before_movie_count = Movie.count

    delete :update, id: movie.id

    expect(Movie.count).to eq(before_ml_count - 1)
    expect(flash[:snack_class]).to eq(:notice.to_s)
    expect(flash[:snack_message]).to ends_with('deleted')
    expect(response).to have_http_status(:redirect)
 end

 describe 'find_with_same_director' do
   it 'should call the find_with_same_director model method' do
     expect(Movie).to receive(:find_with_same_director).with(no_args)
     get :find_with_same_director, id: movie.id
   end
 end
end


#### in factory movie.rb

FactoryGirl.define do
  factory :movie do
    # assign data to movie attributes here.
  end
end

Другие вопросы по теме