2009-12-31 2 views
1

отредактировал: последовали за предложениями. См. В конце вопроса.Интеграционный тест: создать против нового в контроллере

У меня есть контроллер с двумя функциями:

def new 
    if login_required 
      @discussion = Discussion.new 
      respond_to do |format| 
        format.html # new.html.erb 
        format.xml { render :xml => @discussion } 
      end 
     end 
end 


def create 
    if login_required 
     @discussion = Discussion.new(params[:discussion]) 
     @discussion.update_attribute("user_id",session[:userid]) 
     respond_to do |format| 
     if @discussion.save 
      flash[:notice] = 'Discussion was successfully created.' 
      format.html { redirect_to(@discussion) } 
      format.xml { render :xml => @discussion, :status => :created, :location => @Discussion } 
     else 
      format.html { render :action => "new" } 
      format.xml { render :xml => @discussion.errors, :status => :unprocessable_entity } 
     end 
    end 
end 
end 

Теперь в моем тестовом файле интеграции у меня есть:

test "test 1" do 
    post "https://stackoverflow.com/users/login",:user=> { :name => "bob", :password => "test_pass" } 
    post "/discussions/create", :discussion => { :title => "title 1", :body => "discussion body", :id => "101"} #Create 1 
    assert_response :success  #Assert 1 
    get "/discussions/101" 
    assert_response :success  #Assert 2 
end 

Однако я получаю 302 на Assert 1.

Если я изменил «Создать 1» следующим образом: сообщение «/ discussion/new»,: discussion => {: title => "title 1",: body => "body обсуждения",: id => "101"}

Я получаю ошибку 404.

1) Что происходит?

2) какие инструменты/варианты доступны мне, чтобы я сам это понял?

Благодаря

обновление

СЛЕДОВАЛИ предложение (от Ryan Bigg):

  • сообщение: создание, {: обсуждение => {}}, {: user_id => пользователей (: боб) .id}

Результат:

  • Rack :: Lint :: LintError: окр переменная HTTP_USER_ID имеет отличные строковое значение 1976283457

Все еще нерешенной.

ответ

2

Пару вещей:

  1. Попробуйте переместить login_required к before_filter.
  2. Для вашего теста вы должны делать post :create, :discussion => { ... }. Тест должен уже знать о контроллере, если вы правильно настроили его. Я считаю, что соглашение об именах - это DiscussionsControllerTest с головы.

Я думаю, почему вы получаете 302 на Assert 1, потому что это не вход в систему.Попробуйте переходящая в учетных данных в вызове post:

post :create, { :discussion => { } }, { :user_id => users(:bob).id } 

Второй аргумент post является PARAMS Hash и третий аргумент сессии Hash. Обеспечивая вы загрузили пользовательские светильники, и они имеют ключ с именем боб, это должно найти, что и использовать его, чтобы войти.

Альтернативное решение, которое я использую в своей RSpec тестов, чтобы определить login_as метод, который принимает один аргумент логина пользователя, которому я должен войти в систему. Тогда каждый запрос я в мой контроллер или интеграционные тесты вошли в систему как пользователь:

def login_as(name) 
    request.session[:user] = users(name).id 
end 

Я думаю, что вы должны быть в состоянии сделать то же самое в файле test_helper.rb, но ... Я не пробовал Это. YMMV.

+0

спасибо, я попробовал свои предложения, теперь я получаю: Rack :: Lint :: LintError: окр переменная HTTP_USER_ID имеет значение нестроковой 1976283457 – cbrulak

+0

+1 за указание before_filter –

0

Все, кажется, работает правильно в вашем контроллере. В ваших тестах вы отправляете запрос POST, а действие new не принимает запросы POST, а только GET. Действие create принимает POST, но отправляет перенаправление после успешного создания обсуждения.

Вы, вероятно, следует заменить первый assert_response :success с:

assert_redirected_to :controller => "discussions", :action => "show"` 
Смежные вопросы