Визуализация шаблонов тестирования Rspec - PullRequest
15 голосов
/ 28 сентября 2010

Я пытаюсь проверить условие, при котором при успешной регистрации шаблон успеха отображается с помощью следующего кода контроллера


def create
    @user = User.new(params[:user])
    if @user.save
      render :template => "success"
    else
      flash[:notice] = "Oops Somethings not quite right! :("
      render :action => "new"
    end
  end

Я использую следующую спецификацию для проверки этого кода


 before(:each) do
    @user = User.new
    @user.attributes = valid_attributes    
    @params = valid_attributes
    @user.stub!(:save).and_return(true)
  end


  def do_post
    post :create
  end


  it "should create new user " do
    count = User.count
    do_post
    user = User.new(@params)    
    user.save.should eql(true)
    User.count.should eql(count + 1)

  end

  it "should render the success page on successful signup" do
    do_post
    @user.save
    response.should render_template("success") if @user.save
  end

Но в примере не получается «он должен отобразить страницу успеха при успешной регистрации» с этим сообщением об ошибке


1)
'UsersController handling POST /users should render the success page on successful signup' FAILED
expected "success", got "users/new.html.erb"
./spec/controllers/users_controller_spec.rb:67:

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

1 Ответ

25 голосов
/ 28 сентября 2010

Вы указываете переменную @user в тесте, но контроллер создаст новый экземпляр, так что заглушка не будет на месте.

В этом случае не стоит использовать заглушку только для того, чтобы эмулировать успешный вызов сохранения. Почему бы вам не предоставить действительные данные и убедиться, что действие успешно выполнено?

Следующий код предназначен для RSpec> 2.1 и использует синтаксис expect.

before(:each) do
  @params = valid_attributes
end

it "should create new user" do
  @_before = User.count
  post :create, :user => @params

  expect(assigns(:user)).to_not be_new_record
  expect(User.count).to eq(@_before + 1)
end

it "should render the success page on successful signup" do
  post :create, :user => @params

  expect(response).to be_successful
  expect(response).to render_template("success")
end

Наконец, измените

render :template => "success"

до

render :action => "success"

Для предыдущих версий RSpec или если вам нужно использовать синтаксис should, используйте

before(:each) do
  @params = valid_attributes
end

it "should create new user" do
  @_before = User.count
  post :create, :user => @params

  assigns(:user).should_not be_new_record
  User.count.should == (@_before + 1)
end

it "should render the success page on successful signup" do
  post :create, :user => @params

  response.should be_successful
  response.should render_template("success")
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...