Rspec测试所需参数

时间:2013-03-26 20:02:56

标签: ruby-on-rails rspec

我正在使用FactoryGirl和Rspec作为我的测试框架。我有一个模型,它有一个validates_presence_of验证。基本的Rspec框架包括一个测试:

describe "with invalid params" do
  it "assigns a newly created but unsaved disease as @disease" do
    # Trigger the behavior that occurs when invalid params are submitted
    Disease.any_instance.stub(:save).and_return(false)
    post :create, :disease => {}
    assigns(:disease).should be_a_new(Disease)
  end
end

编辑: diseases_controller.rb

 # POST /diseases
 # POST /diseases.xml
 def create
   @disease = Disease.new(disease_params)

   respond_to do |format|
     if @disease.save
       format.html { redirect_to(@disease, :notice => 'Disease was successfully created.') }
       format.xml  { render :xml => @disease, :status => :created, :location => @disease }
     else
       format.html { render :action => "new" }
       format.xml  { render :xml => @disease.errors, :status => :unprocessable_entity }
     end
   end
 end

 private
 def disease_params
   params.require(:disease).permit(:name, :omim_id, :description)
 end

此测试不适用于我的应用程序的工作方式。它不是在错误的帖子上返回新疾病,而是返回错误:

Required parameter missing: disease

问题#1:我不知道如何查看Rspec发布的内容。在这种情况下似乎没有创建response对象?打印assigns(:disease)似乎不包含任何内容。我收到了我之前发布的错误消息,提交了一个cURL帖子到空数据的正确URL(这是rspect帖子应该做的),但我不知道如何获取Rspec从哪个接收回来的信息发表声明。

问题2:如何正确测试应该发生的响应 - 它收到一条错误消息,说明缺少必需的参数?

编辑: 所以我的控制器似乎表明它应该会引发新的疾病,但测试失败了。如果我尝试在网站上提交缺少所需参数的疾病,那么它会发出闪烁通知,上面写着“姓名不能为空”。我不确定如何在rspec中测试它。

编辑#2: 包含上面的代码。 disease_params根据使用strong_parameters gem的建议在控制器的底部定义。

谢谢!

1 个答案:

答案 0 :(得分:3)

回答问题1(“我不知道如何通过Rspec查看返回的内容的帖子”)...您可以在规范中使用“puts”语句(即{{1}内) })。例如,您可以尝试这样的事情:

it

这是一个很有价值的调试工具。当RSpec运行时,输出将在终端的.s和Fs中。

对于问题2,我不太确定您在寻找什么,但我不知道您是否需要(或应该)测试无效疾病被指定为@disease。我倾向于以下列样式模式化控制器规范(取自Everyday Rails Testing with RSpec,这是我学习如何编写控制器规范的地方)。

POST创建规范示例:

describe "with invalid params" do
  it "assigns a newly created but unsaved disease as @disease" do
    # Trigger the behavior that occurs when invalid params are submitted
    Disease.any_instance.stub(:save).and_return(false)
    post :create, :disease => {}
    puts :disease
    assigns(:disease).should be_a_new(Disease)
  end
end

您可能有理由更彻底地测试我不知道的控制器方法。在这种情况下,请不要理会我对问题2的回答,希望我的另一个答案是有用的!