如何为以下代码创建RSpec测试

时间:2019-03-28 02:01:31

标签: ruby-on-rails ruby 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

,但未正确覆盖它。任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:0)

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