TDD с RSpec и Rails: тестирование действий контроллера без представления - PullRequest
3 голосов
/ 04 октября 2011

Продолжая изучать TDD с помощью RSpec 2 и Rails 3.1, я не могу найти решение этой проблемы.

У меня есть контроллер Users с новым действием и действием create.В моей спецификации UsersController у меня есть

users_controller_spec.rb

describe "POST 'create'" do
  before(:each) do
    @attr = Factory.attributes_for(:user)
  end

  it "should assign an @user variable" do
    post :create, :user => @attr
    assigns[:user].should_not be_nil
    assigns[:user].should be_kind_of(User)
  end
end

, а в моем UsersController

users_controller.rb

def create
  @user = User.new(params[:user])
end

Эта спецификация не работает с

1) UsersController POST 'create' should assign an @user variable
   Failure/Error: post :create, :user => @attr
   ActionView::MissingTemplate:

Я могу продолжать реализовывать код приложения для прохождения этого теста, но я чувствую, что этот тест должен проходить как есть.

Есть предложения?

Ответы [ 3 ]

3 голосов
/ 30 января 2015

Для проверки рендеринга ничего не нужно:

expect(response).to render_template(nil)
3 голосов
/ 04 октября 2011

Ваш метод create должен что-то сделать. Либо отрендерить шаблон, либо перенаправить. Поскольку вы не говорите ему перенаправить, предполагается, что вы хотите, чтобы он отобразил шаблон, но когда он не может найти файл create.html.erb, он выдает ошибку.

Лучше всего сделать следующее:

def create
  @user = User.new(params[:user])
  redirect_to root_url
end

или это:

def create
  @user = User.new(params[:user])
  render :nothing => true
end
0 голосов
/ 18 октября 2011

Я сам с этим недавно сталкивался.Кажется, одна из возможностей - спасти ошибку в вашем тесте.

it "should assign an @user variable" do
  begin
    post :create, :user => @attr
  rescue ActionView::MissingTemplate
    # This is okay because(/as long as) we test the render/redirect
    # in a separate spec where we don't rescue this exception.
  end
  assigns[:user].should_not be_nil
  assigns[:user].should be_kind_of(User)
end

Я не знаю, насколько «правильным» является это решение.С одной стороны, это определенно подчеркивает менталитет «тестирование по одному», с другой - кажется уродливым.может сделать несколько хороших оберток в вашем помощнике спецификаций, например,

def post?(action, params = {})
  post action, params
rescue ActionView::MissingTemplate
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...