使用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是我所期望的?等。
答案 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。