2013-04-24 131 views
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是我期望的?等等。

回答

1

对于控制器规范,你会设置mock来处理请求的认证。你只想测试一下,如果params[:user_id]通过,那么@items被设置为用户项目,如果没有,那么所有项目。

对于请求规范,您将简单地包含一些测试以验证身份验证过程。

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

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;你可以使用Fixture或者FactoryGirl,在一个块之前实例化一个,或者仅仅存根/模拟全部。如果可以的话,最好避免碰到数据库。对于像Item.all和关联这样的事情可能会有点棘手,如果没有残留或坚持到测试数据库,这些连接就更难。模拟和存根使得它变得容易,但是如果模型改变,也会让你的测试变得更加脆弱。

对于请求规范,我会创造真正的数据库对象,做这样的事情,使用水豚:

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响应;控制器的工作就是将数据转移到正确的视图。您也可以单独测试视图,然后在请求规范中测试整个端到端场景。