Простой вопрос rspec - PullRequest
       12

Простой вопрос rspec

0 голосов
/ 23 июня 2011

Я действительно изо всех сил пытаюсь выучить rspec :( Так что я надеюсь, что вы можете немного помочь мне с очень простым действием create в контроллере. Я хотел бы использовать для этого Rspec :: mocks, так какЯ думаю, что это способ сделать это? Вместо того, чтобы попадать в базу данных при тестировании.

У меня есть before_filter:

def find_project
   @project= Project.find_by_id(params[:project_id])
end

Действие создания выглядит так:

def create
  @batch = Batch.new(params[:batch])
  @batch.project = @project

  if params[:tasks]
    params[:tasks][:task_ids].each do |task_id|
      @batch.tasks << Task.find(task_id)
    end
  end

  if @batch.save
    flash[:notice] = "Batch created successfully"
    redirect_to project_batch_url(@project, @batch)
  else
    render :new
  end
end

Я действительно сомневаюсь, когда дело доходит до @batch.project = @project как мне определить @project? А также целую params[:tasks][:task_ids].each часть ... Да .. в значительной степени все это: (

Извините за этот вопрос новичка - надеюсь, что вы, ребята, можете помочь или, по крайней мере, указать мне правильное направление:)

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 июня 2011

Использование BDD поможет вам определить ваши интерфейсы.Поэтому, если ваш контроллер хочет, чтобы проект создал пакет и добавил несколько идентификаторов задач, то «напишите код, который вы хотели бы иметь».На практике для контроллеров это означает попытку вытолкнуть логику из контроллера в ваши модели.Тестирование моделей имеет тенденцию быть более интуитивным и определенно более быстрым, чем тестирование контроллеров.

Вот некоторые возможные спецификации (не проверенные) с точки зрения "mockist":

# controller spec  
describe BatchesController do
  def mock_project(stubs={})
    @mock_project ||= mock_model(Project, stubs)
  end

  def mock_batch(stubs={})
    @mock_batch ||= mock_model(Batch, stubs)
  end

  context "POST create"
    it "calls #create_batch_and_add_tasks on the project"
      mock_project.should_receive(:create_batch_and_add_tasks).with(
        :batch => { :name => 'FooBatch' },
        :task_ids => [1,2,3,4]
      )
      Project.stub(:find).and_return(mock_project)

      post :create, :batch => { :name => 'FooBatch' }, :tasks => { :task_ids => [1,2,3,4] }
      # consider changing your params to :batch => { :name => 'FooBatch', :task_ids => [1,2,3,4] }
    end

    it "redirects to the project_batch_url on success" do
      mock_project(:create_batch_and_add_tasks => mock_batch(:save => true))
      Project.stub(:find) { mock_project }
      post :create, :these_params => "don't matter because you've stubbed out the methods"
    end

# controller
def create
  @batch = @project.create_batch_and_add_tasks(
             :batch => params[:batch],
             :task_ids => params[:tasks].try([:tasks_ids])
           )
  if @batch.save
    ...
0 голосов
/ 23 июня 2011

Идея спецификации контроллера состоит в том, чтобы проверить, устанавливают ли действия переменные экземпляра и, при необходимости, перенаправляет / рендерит.Чтобы настроить спецификацию, вы обычно создаете объект или макет, устанавливаете атрибуты / заглушки, а затем вызываете действие, передавая при необходимости хэш параметров.

Так, например, (воздушный код):

describe MyController do
  before(:each) do
    @project = mock_model(Project)
    Project.stub(:find_by_id) {@project}
    @batch = mock_model(Batch)
    Batch.stub(:new) {@batch}
  end

  it "should redirect to project_batch_url on success" do
    @batch.stub(:save) {true)
    post :create, :batch => { :some_key => :some_value }, :tasks => { :task_ids => [1,2,3] }
    response.should redirect_to(project_batch_url(@project,@batch))
  end

  it "should render :new on failure" do
    @batch.stub(:save) {false)
    post :create, :batch => { :some_key => :some_value }, :tasks => { :task_ids => [1,2,3] }
    response.should render_template("new")
  end
end

Более подробную информацию об этом можно найти в документах RSpec Rails .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...