【问题标题】:RSpec request example failingRSpec 请求示例失败
【发布时间】:2014-06-12 19:00:16
【问题描述】:

我正在尝试做一个非常简单的请求规范来测试我的应用程序中的 API 方法。现在我收到了 302 消息,而我应该通过这个测试获得 200 条消息。

规格:

require 'spec_helper'

describe UsersController do
  describe "#create" do
    it "creates a new user " do
      post '/users', user: FactoryGirl.attributes_for(:user)
      expect(response.status).to eq 200
    end
  end
end 

工厂:

FactoryGirl.define do
  factory :user do
    sequence(:name)  { |n| "Person #{n}" }
    sequence(:username) { |n| "Person#{n}" } 
    sequence(:email) { |n| "person_#{n}@example.com"}
    password "foobar"
    password_confirmation "foobar"
  end
end

控制器方法:

def create
  @user = User.new(user_params)

  respond_to do |format|
    if @user.save
      format.html { redirect_to @user, notice: 'User was successfully created.' }
      format.json { render :show, status: :created, location: @user }
    else
      format.html { render :new }
      format.json { render json: @user.errors, status: :unprocessable_entity }
    end
  end
end

我错过了什么?

【问题讨论】:

  • 从您的代码中,您在给出非异步请求时显然提到了重定向。
  • 我实际上只想测试 json 响应,而不是 html 响应。为此,我在测试中遗漏了什么?

标签: ruby-on-rails rspec request integration-testing


【解决方案1】:

所以你需要做一个异步的post请求,它应该像下面这样,

it "creates a new user " do
  xhr :post, '/users', user: FactoryGirl.attributes_for(:user)
  expect(response.status).to eq 200
end

试试这个,可能有用

【讨论】:

  • 这并没有解决响应问题,问题是我没有将 Accept 标头设置为 json 所以它只是返回了 html 响应。无论如何,谢谢,我会用我的解决方案发布答案​​。
【解决方案2】:

为了解决这个问题,我需要将ACCEPT 标头添加到我的请求中,如下所示:

post "/users", { user: @user } , { accept: 'application/json' }

这样做解决了服务器没有将请求解释为期望 json 作为回报的问题。

【讨论】:

    猜你喜欢
    • 2023-01-08
    • 1970-01-01
    • 2019-02-09
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    相关资源
    最近更新 更多