Как получить покрытие rspe c при сбое .save - PullRequest
2 голосов
/ 17 июня 2020

В моем контроллере у меня есть следующий код:

def create
    @post = Post.new(post_params)
    if @post.save
      flash[:notice] = "#{@post.title} was successfully created."
      redirect_to post_path
    else
      flash[:alert] = @post.errors.full_messages
      render :new
    end
end

Мне удалось написать код rspe c, чтобы охватить истинное утверждение в функции spe c, однако я борюсь за ложное заявление. Пока что это rspe c, который я придумал для решения моей проблемы (помещен в posts_controller_spe c .rb):

it 'should return false and render the new template' do 

    allow_any_instance_of(Post).to receive(:valid?).and_return(false)

    expect(response).to render_template(:new)

end

К сожалению, я столкнулся со следующей ошибкой:

Failures:

  1) PostsController create should return 
     Failure/Error: expect(response).to render_template(:new)
       expecting <"new"> but rendering with <[]>

Я пробовал смотреть другие вопросы о stackoverflow, а также другие предложения в Интернете, но, похоже, не могу понять.

Любая помощь будет принята с благодарностью :)

1 Ответ

1 голос
/ 18 июня 2020

В вашем тесте вы никогда не вызываете контроллер.

it 'renders the new template' do 
  allow_any_instance_of(Post).to receive(:valid?).and_return(false)

  post :create, params: {...}

  expect(response).to render_template(:new)
end

Было бы проще сделать receive(:save).and_return(false).


Однако в макете нет необходимости Вот. Отправить неверные параметры сообщения.

context 'when the Post params are invalid' do
  let(:params) do
    {
      post: { something: "invalid" }
    }
  end

  it 'does not make a Post, renders the new template, and flashes an error' do
    expect {
      post :create, params: params
    }.to change {
      Post.count
    }.by(0)

    expect(response).to render_template(:new)
    expect(flash[:alert]).not_to be_empty
  end
end
...