Мне нужно создать тестирование 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
но он не покрывает его правильно. Любая помощь будет оценена, спасибо.
Ну, это для задания, поэтому ничего не могу с этим поделать. Я имею в виду, я думаю, что мой синтаксис для тестов неверен, поскольку они возвращают ошибку, хотя они должны работать.
Было бы полезнее, если бы вы могли указать причину сбоя, которую вы получаете.
Почему вы не ожидаете никаких аргументов с find_with_same_director? В контроллере вы передаете туда аргумент.
Вы правы, я изменил его на with(params[:id]), потому что это то, что я передаю, когда вызываю функцию @maxpleaner
так ... это был провал?





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