如何编写请求规范来测试用户登录?

3

我正在尝试编写一个规范来测试我的用户登录API,但是当我运行规范时,我不断收到JSON电子邮件/密码不正确的错误401。我正在执行以下操作:

require 'spec_helper'

describe User do
  subject(:user) do
    Program.create!(name: 'test', gender: 'Female', goal_id: '1', experience_id: '1')
    User.create!(email: 'test@test.com', password: '12345678', password_confirmation: '12345678', goal_id: '1', experience_level_id: '1', gender: 'Female')
  end

  it "is logged in" do
    post "/api/v1/login", user_login: {email: 'test@test.com', password: '12345678' }
    response.status.should be(201)
  end
end

有什么想法吗?

编辑1

这是我的sessions_controller,在用户通过API登录时使用。

class Api::V1::SessionsController < Devise::SessionsController
    before_filter :authenticate_user!, except: [:create, :destroy]
    before_filter :ensure_params_exist
    skip_before_filter :verify_authenticity_token

  def create
    resource = User.find_for_database_authentication(email: params[:user_login][:email])
    return invalid_login_attempt unless resource

    if resource.valid_password?(params[:user_login][:password])
        sign_in("user", resource)
        resource.ensure_authentication_token!
        render 'api/v1/sessions/new.json.jbuilder', status: 201
        return
    end
    invalid_login_attempt
  end

  def destroy
        current_user.reset_authentication_token
        render json: {success: true}
  end

  protected

  def ensure_params_exist
    return unless params[:user_login].blank?
    render json: {success: false, message: "missing user_login parameter"}, status: 422
  end

  def invalid_login_attempt
    render 'api/v1/sessions/invalid.json.jbuilder', status: 401
  end
end

如果您发布您的登录控制器,将会很有帮助。 - usha
我建议您检查日志输出,确保它已经到达了控制器操作,然后开始使用debuggerputs来查看您期望的参数是否实际传入。 - Aidan Feldman
如何检查我的日志输出?服务器输出没有任何反应。 - Arel
1个回答

1

我离成功很近,或许正因为如此我才遇到了这么多问题。以下是我的解决方法:

require 'spec_helper'

describe "sessions" do
  before do
    FactoryGirl.create(:program)
    @user = FactoryGirl.create(:user)
  end

  describe "user" do
    it "is logged in" do
  post "/api/v1/login", user_login: {email: @user.email, password: @user.password }

      response.status.should be(201)
    end
  end
end

我将subject块替换为before块,并使用实例变量来存储电子邮件和密码。就这样!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接