【问题标题】:Testing REST-API responses with Rspec and Rack::Test使用 Rspec 和 Rack::Test 测试 REST-API 响应
【发布时间】:2011-11-09 15:51:59
【问题描述】:

我有点难过。我有以下集成测试:

require "spec_helper"

describe "/foods", :type => :api do
  include Rack::Test::Methods

  let(:current_user) { create_user! }
  let(:host) { "http://www.example.com" }

  before do
    login(current_user)
    @food = FactoryGirl.create_list(:food, 10, :user => current_user)
  end

  context "viewing all foods owned by user" do

    it "as JSON" do
      get "/foods", :format => :json

      foods_json = current_user.foods.to_json
      last_response.body.should eql(foods_json)
      last_response.status.should eql(200)

      foods = JSON.parse(response.body)

      foods.any? do |f|
        f["food"]["user_id"] == current_user.id
      end.should be_true

      foods.any? do |f|
        f["food"]["user_id"] != current_user.id
      end.should be_false
    end

  end

  context "creating a food item" do

    it "returns successful JSON" do
      food_item = FactoryGirl.create(:food, :user => current_user)

      post "/foods.json", :food => food_item

      food = current_user.foods.find_by_id(food_item["id"])
      route = "#{host}/foods/#{food.id}"

      last_response.status.should eql(201)
      last_response.headers["Location"].should eql(route)
      last_response.body.should eql(food.to_json)
    end

  end

end

我添加了所需的 Rack::Test::Methods 来获取last_response 方法,但它似乎无法正常工作。 last_response 似乎总是向我显示登录页面,即使我已经登录了。

如果我删除 Rack::Test::Methods last_response 消失,我可以改用 response 并得到当前响应。一切似乎都正常。

这是为什么? response 方法来自哪里?我可以使用response 获取会话的先前响应吗?

我需要使用last_response 或类似的东西来表示

last_response.headers["Location"].should eql(route)

这样我就可以匹配路线。如果不是因为这个,我会被设置。

【问题讨论】:

  • login 的代码是什么 - 这是 rspec 定义的方法还是您在其他地方定义的?登录页面是否需要重定向才能工作?如果是这样,请在登录代码后添加follow_redirect!
  • 您想出的解决方案是什么?我也使用Ticketee 示例,但last_response 仍然不包含我期望的响应?另外,不要忘记标记其中一个答案。

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


【解决方案1】:

response 对于某些规范类型是自动的。

Rspec 可能将ActionController::TestCase::Behavior:type => :api 块混合在一起。
response 将来自ActionController::TestCase::Behavior,就像它用于:type => :controller 块一样。

如果您想在response 给出的响应之前获得响应,请尝试在发出下一个请求之前将其存储在变量中。

https://www.relishapp.com/rspec/rspec-rails/v/2-3/docs/controller-specshttps://github.com/rspec/rspec-rails 提供了一些关于混合了一些不同规格类型的信息。

【讨论】:

  • 我遇到了同样的问题,当我将它们放在规范/控制器中时,我的规范不起作用,当我将 API 规范移动到单独的文件夹时,我没有收到此错误
【解决方案2】:

我认为login(current_user) 不适用于 Rack::Test::Methods。您需要一种通过 API 调用进行身份验证的方法,可能使用身份验证令牌。

response 与 ActionController 绑定,后者知道您的登录信息。如果我没记错的话,API调用是独立于Controller的,所以它不知道你已经登录了。

请参阅Ticketee,来自Rails 3 in Action 的示例应用程序,例如!

【讨论】:

    猜你喜欢
    • 2015-03-25
    • 2012-02-19
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多