Ruby on rails 什么属于控制器规范,什么属于请求规范?

Ruby on rails 什么属于控制器规范,什么属于请求规范?,ruby-on-rails,rspec,rabl,Ruby On Rails,Rspec,Rabl,使用Rspec,我试图为我的API创建一个控制器规范,以及一个请求规范。问题是我不明白每个规范中测试的哪一部分 为简单起见,假设我的控制器如下所示: class Api::V1::ItemsController < ApplicationController def index if params[:user_id] user = User.find(params[:user_id]) @items = user.items else

使用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
class Api::V1::ItemsController
它使用RABL来呈现响应


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

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

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


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

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

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


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

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

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
一个用于
用户id
路径,另一个不带路径。我将设置
@user
留给您;您可以使用fixture或FactoryGirl,在before块中实例化一个fixture,或者干脆将其全部存根/模拟出来。如果可以的话,最好避免访问数据库。对于
Item.all
和关联之类的东西来说,这可能会有点棘手,如果不保留测试数据库,就很难将它们连接起来。模拟和存根使测试变得简单,但如果模型发生变化,测试也会变得更脆弱

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

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

..对于具有
用户id的路径类似。如果不知道你的数据以及你是如何呈现的,我就不能说得更具体了。如果您使用的是JSON,那么应该在这里检查整个JSON响应。不过,我不会在控制器规范中检查JSON响应;控制器的工作只是将数据移动到正确的视图中。您也可以单独测试视图,然后在您的请求规范中测试整个端到端场景。

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

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
一个用于
用户id
路径,另一个不带路径。我将设置
@user
留给您;您可以使用fixture或FactoryGirl,在before块中实例化一个fixture,或者干脆将其全部存根/模拟出来。如果可以的话,最好避免访问数据库。对于
Item.all
和关联之类的东西来说,这可能会有点棘手,如果不保留测试数据库,就很难将它们连接起来。模拟和存根使测试变得简单,但如果模型发生变化,测试也会变得更脆弱

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

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
..对于具有
用户id的路径类似。如果不知道你的数据以及你是如何呈现的,我就不能说得更具体了。如果您使用的是JSON,那么应该在这里检查整个JSON响应。不过,我不会在控制器规范中检查JSON响应;控制器的工作只是将数据移动到正确的视图中。您也可以单独测试视图,然后在您的请求规范中测试整个端到端场景