Как написать спецификацию контроллера для метода, который возвращает объект, но без проверки каких-либо связанных шаблонов

Я хотел бы задать свой вопрос более развернуто на базовом примере.

1) I have UsersController
2) I have show method in it
3) But I don't have any templates for this method(either - show.html.erb/show.xml.erb etc)
4) So currently, I just wanted to write a spec for just checking whether my method is returning an object or not
5) it is working, but as it is CRUD related method, it is expecting a Template for it.
6) ActionView::MissingTemplate

Я пробовал таким образом

it "should show the user record" do
  get :show, :id => 1
  User.should_receive(:find).at_least(:once).with(1).and_return(mock_user)
end
class UsersController
  def show
    # params = {}
    # params = {:id => 1}
    @user_obj = User.find(params[:id]) # ActiveRecord::Relation
  end
end

require 'spec_helper'

describe UsersController do
  def mock_user(stubs={})
    @mock_user ||= mock_model(User, stubs).as_null_object
  end

  it "should show the user record" do
    expect(assigns(:user_obj)).to eq(mock_user) # How to stop execution  here only.
  end
end

ActionView::MissingTemplate: Отсутствуют пользователи/показ шаблона с {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html], :locale=>[:en, :en]} в путях просмотра "#"


person Aravind Aytha    schedule 04.07.2019    source источник


Ответы (2)


То, что вы пытаетесь сделать, кажется мне неправильным. Этот тип тестирования (контроллерные тесты) для проверки реакции действия и рендеринга. поэтому вам не следует этого делать, вы должны проверить вывод рендеринга действия. в противном случае, если вы хотите протестировать только метод show (модульное тестирование), не используйте get здесь, вы можете сделать это

users_controller = UsersController.new
users_controller.show 

и протестируйте его как любой метод внутри любого класса

person M.Elkady    schedule 04.07.2019
comment
Огромное спасибо за помощь. Как вы сказали, это правильно. На самом деле нам нужны спецификации для тестирования его полного метода, а также для тестирования его рендеринга, но поскольку рефакторинг кода цели происходит для обновления рельсов, они удалили ненужные методы и шаблоны. Таким образом, я хотел сосредоточиться только на методах контроллера, которые возвращают какие-либо объекты, но не работают с шаблонами его рендеринга. - person Aravind Aytha; 05.07.2019
comment
Спасибо, что подали идею. Попробовал таким способом, работает. it "should show the user record" do # expect(assigns(:user_obj)).to eq(mock_user) # How to stop execution here only. User.stub(:find).with(1) { mock_user } controller.params[:id] = 1 controller.show assigns(:user_obj).should be(mock_user) end - person Aravind Aytha; 05.07.2019
comment
Да, это напишите ответ для меня ..! - person Aravind Aytha; 06.07.2019

вам не хватает рендера, поэтому он ищет шаблон для рендера.

class UsersController
  def show
    # params = {}
    # params = {:id => 1}
    @user_obj = User.find(params[:id])
    render status: 200, json: @user_obj
  end
end

Теперь ваша спецификация должна работать.

person Venkateshwara Cholan    schedule 04.07.2019
comment
Спасибо за это, но в настоящее время я не хочу проверять какие-либо изменения, которые я хотел проверить только для методов, возвращающих объекты, и это работает таким образом. it "should show the user record" do # expect(assigns(:user_obj)).to eq(mock_user) # How to stop execution here only. User.stub(:find).with(1) { mock_user } controller.params[:id] = 1 controller.show assigns(:user_obj).should be(mock_user) end - person Aravind Aytha; 05.07.2019
comment
ваша спецификация по-прежнему будет работать с упомянутым изменением. визуализация предотвратит ошибку отсутствия шаблона, и вы все равно можете проверить назначение, поскольку я назначил пользовательский объект @user_obj, и он будет равен фиктивному пользователю - person Venkateshwara Cholan; 06.07.2019