什么属于控制器规范以及什么属于请求规范?

时间:2013-04-24 21:32:19

标签: 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
      @items = Item.all
    end
  end
end

它使用RABL呈现响应。

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

2 个答案:

答案 0 :(得分: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路径。我将Item.all设置给你;你可以使用fixtures,或FactoryGirl,在before块中实例化一个,或者只是将它们存根/嘲笑。如果可以的话,尽量避免点击数据库是件好事。对于像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 和关联这样的事情来说,这可能会有点棘手,如果没有存根或持久存在测试数据库,这些事情很难连接起来。模拟和存根使其变得简单,但如果模型发生变化,也会使测试变得更加脆弱。

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

user_id

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

答案 1 :(得分:1)

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

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

如果你问我,我会在两次测试中验证api响应为json。