Как протестировать json login в devise с помощью rspec

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

Я создал SessionsController вот так :

class SessionsController < Devise::SessionsController

  def create  
    resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
    set_flash_message(:notice, :signed_in) if is_navigational_format?
    sign_in(resource_name, resource)

    respond_to do |format|  
      format.html { super }  
      format.json {  
        render :status => 200, :json => { :error => "Success", :user =>  resource}.to_json  
      }  
    end  
  end

  def destroy  
    super  
  end
end

Мои маршруты:

devise_for :users, :controllers => {:sessions => "sessions"}
resources :users

Затем у меня есть следующая спецификация для тестирования процесса:

require 'spec_helper'

describe SessionsController do

  describe "POST 'signin'" do

    before (:each) do
      @user = Factory(:user)
    end

    it "should login with json request" do
      @expected = @user.to_json

      post :create, :user => {:email => 'user@test.com', :password => 'please'}, :content_type => 'application/json', :format => :json
      response.body.should == @expected
    end

  end

end

И я получаю следующую ошибку:

Failure/Error: post :create, :user => {:email => 'user@test.com', :password => 'please'}, :content_type => 'application/json', :format => :json
     AbstractController::ActionNotFound:
       Could not find devise mapping for path "/users/sign_in.json?content_type=application%2Fjson&user%5Bemail%5D=user%40test.com&user%5Bpassword%5D=please".
       Maybe you forgot to wrap your route inside the scope block?

[EDIT] Похоже, что функциональность в порядке, но только тест нарушен; потому что если я запускаю этот небольшой скрипт:

require 'rest_client'
require "active_support/core_ext"

RestClient.post "http://localhost:3000/users/sign_in", {:user => {:email => 'user@test.com', :password => 'please'}}.to_json, :content_type => :json, :accept => :json

я получаю следующий результат:

"{\"error\":\"Success\",\"user\":{\"email\":\"user@test.com\",\"name\":\"First User\"}}"

который является ожидаемым.

7
задан obo 5 October 2011 в 08:09
поделиться