Rails 3.1 Rspec Rails 2 - Как я могу проверить это действие контроллера? - PullRequest
3 голосов
/ 19 ноября 2011

Мне нужно знать, как проверить это действие контроллера

  def create_mobile
      if mobile_user = MobileUser.authenticate(params[:email], params[:password])
        session[:mobile_user_id] = mobile_user.id
        respond_to do |format|
          format.json { head :ok }
        end
      else
        respond_to do |format|
          format.json { head :unauthorised }
        end
      end
  end

Маршрут представляет собой пост-запрос к session / create_mobile, и, как вы можете видеть, действие реагирует только на json

Моя текущая спецификация контроллера выглядит так

describe SessionsController, "Logging in" do

  before(:each) do
    @mobile_user = FactoryGirl.create(:valid_mobile_user)
  end

  it "Should log in mobile user" do
    @request.env["HTTP_ACCEPT"] = "application/json"
    post :create_mobile, {:password => @mobile_user.password, :email => @mobile_user.email}
    response.should be_success
  end

  it "should fail log in mobile user" do
    @request.env["HTTP_ACCEPT"] = "application/json"
    post :create_mobile, {:password => 'joe', :email => @mobile_user.email}
    response.should_not be_success
  end

конец

Результаты теста в

  1) SessionsController Logging in should log in mobile user
     Failure/Error: response.should be_success
       expected success? to return true, got false
     # ./spec/controllers/sessions_controller_spec.rb:11:in `block (2 levels) in <top (required)>'

Таким образом, либо проблема с кодом моего приложения, либо проблема с моим тестовым кодом, но в любом случае не возникает проблем с методом authenticate при прохождении спецификации модели MobileUser, которая выглядит следующим образом

  it "should authenticate" do
    mu = FactoryGirl.create(:valid_mobile_user)
    assert_equal 1, MobileUser.count
    assert_equal mu, MobileUser.authenticate(mu.email, mu.password)

  end

Любая помощь в выяснении этого очень ценится. Заранее спасибо

UPDATE Как предлагается ниже, используя

post :create_mobile, {:password => 'joe', :email => @mobile_user.email} :format => :json

или используя

@request.env["HTTP_ACCEPT"] = "application/json"

или их комбинация не имеет значения

ОБНОВЛЕНИЕ 2 Тест только начал работать без причины, которую я могу понять (кроме того, что я никогда не понимал, почему он не работал в первую очередь). Совершенно странно!

Ответы [ 3 ]

9 голосов
/ 16 февраля 2012

Я недавно столкнулся с той же проблемой. ниже мой тестовый код

post :create, :login => 'mock_user', :password => 'passwd', :format => :json

expected = {
    :login => 'mock_user'
}.to_json

session[:user_id].should == mock_user.id
response.body.should == expected

Результат теста ложный, вызванный response.body пусто. Я проверил test.log и обнаружил недопустимую ошибку запроса 406 в контроллере. После долгих поисков я изменил на: format => 'json'. Тогда я получил ожидаемый результат теста.

1 голос
/ 19 ноября 2011

Поскольку вы пытаетесь опубликовать JSON на контроллере, не следует ли преобразовать свой хэш в JSON?

post :create_mobile, {:password => 'joe', :email => @mobile_user.email}.to_json

Если вы не хотите добавлять семь символов в ваш код, просто чтобы посмотреть, работает ли он, вы должны вывести свои параметры в logger, чтобы посмотреть, как они выглядят.

def create_mobile
  logger.info "LOGIN PARAMS U/N: #{params[:email]}, P/W: #{params[:password]}"
  ...

Затем выполните tail -f log / test.log, чтобы увидеть, как выглядит ваш контроллер во время теста.

0 голосов
/ 19 ноября 2011

пытались ли вы добавить опцию :format в оператор записи

...