0

使用 Rspec,我正在尝试为我的 API 创建一个控制器规范以及一个请求规范。问题是我不明白每个规范中的测试部分。

为简单起见,假设我的控制器如下所示:

class Api::V1::ItemsController < ApplicationController
  def index
    if params[:user_id]
      user = User.find(params[:user_id])
      @items = user.items
    else
      @items = Item.all
    end
  end
end

它使用 RABL 来呈现响应。

对于这么简单的控制器,控制器规范是什么样的?请求规范是什么样的?我在什么时候验证 API 响应 JSON 是我所期望的?等等

4

2 回答 2

2

对于控制器规范,我会编写如下测试:

it "renders with a user_id" do
  get :index, id: @user.id
  assigns(:items).should == @user.items
  response.should be_success
  response.should render_template("index")
end

一个用于user_id路径,一个没有。我把设置留给@user你;您可以使用固定装置或 FactoryGirl,在前块中实例化一个,或者只是将其全部存根/模拟。如果可以的话,最好避免访问数据库。对于诸如和关联之类的东西,这可能会有点棘手,Item.all如果没有存根或持久化到测试数据库,它们就更难连接起来。Mocking 和 stubbing 使得它变得容易,但如果模型发生变化,也会让你的测试变得更加脆弱。

对于请求规范,我将使用 Capybara 创建真正的 DB 对象并执行以下操作:

it "lists all items without a user_id" do
  visit foo_path
  current_path.should == foo_path
  page.should have_content(item1.name)
  page.should have_content(item2.name)
end

..和类似的路径与user_id. 在不知道您的数据以及如何呈现它的情况下,我无法更具体。如果您使用的是 JSON,则应在此处检查整个 JSON 响应。不过,我不会检查控制器规范中的 JSON 响应;控制器的工作只是将数据洗牌到正确的视图。您也可以单独测试视图,然后在您的请求规范中测试整个端到端场景。

于 2013-04-24T22:47:56.277 回答
1

对于控制器规范,您将设置将处理请求身份验证的模拟。您只想测试是否params[:user_id]通过,则@items设置为用户项目,如果没有,则设置为所有项目。

对于请求规范,您只需包含一些测试来验证身份验证过程。

如果您问我,我将在两个测试中将 api 响应验证为 json。

于 2013-04-24T22:30:16.333 回答