Rspec, что не так с моим тестом для создания действия контроллера? - PullRequest
0 голосов
/ 31 марта 2012

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

Я хочу проверить create действие контроллера, а вот мой код для проверки:

require 'spec_helper'

describe MoviesController do
  describe 'create' do
    it 'should call the model method perform create!' do
      Movie.should_receive(:create!).with({"title" => 'Milk', "rating" => 'R'})
      post :create, :movie => {:title => 'Milk', :rating => 'R'}
    end
  end
end

Но я получил:

Failures:

  1) MoviesController create should call the model method performe create!
     Failure/Error: post :create, :movie => {:title => 'Milk', :rating => 'R'}
     NoMethodError:
       undefined method `title' for nil:NilClass
     # ./app/controllers/movies_controller.rb:50:in `create'
     # ./spec/controllers/movies_controller_spec.rb:7:in `block (3 levels) in <top (required)>'

Finished in 0.21714 seconds

А вот и создай действие, против которого я тестирую. Да, это TDD, и да, я тестирую рабочий код, и это тестирование не работает: D

 def create
    @movie = Movie.create!(params[:movie])
    flash[:notice] = "#{@movie.title} was successfully created."
    redirect_to movies_path
 end

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

Приветствия

1 Ответ

0 голосов
/ 31 марта 2012

Когда вы делаете таким образом should_receive, он вернет ноль, поэтому следующая строка (при установке флеш-сообщения) пытается получить заголовок из ноля.Измените свой must_receive на:

  Movie.should_receive(:create!).with({"title" => 'Milk', "rating" => 'R'}).and_return(stub_model(Movie))
...