gpt4 book ai didi

ruby-on-rails - Rspec 测试所需参数

转载 作者:行者123 更新时间:2023-12-02 00:10:36 26 4
gpt4 key购买 nike

我正在使用 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:如何正确测试应该发生的响应 - 它收到一条错误消息,指出缺少必需的参数?

编辑:所以我的 Controller 似乎表明它应该呈现出一种新的疾病,但测试失败了。如果我尝试在网站上提交缺少所需参数的疾病,那么它会显示一条提示“名称不能为空”的提示。我不确定如何在 rspec 中测试它。

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

谢谢!

最佳答案

要回答问题 1(“我不知道如何查看 Rspec 返回的内容”)...您可以在您的规范中使用“puts”语句(即在 it block )。例如,您可以尝试这样的操作:

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

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

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

POST 创建规范示例:

context "with invalid attributes" do
it "does not save the new contact" do
expect{
post :create, contact: Factory.attributes_for(:invalid_contact)
}.to_not change(Contact,:count)
end

it "re-renders the new method" do
post :create, contact: Factory.attributes_for(:invalid_contact)
response.should render_template :new
end
end
...

您可能有理由更彻底地测试我不知道的 Controller 方法。在那种情况下,请无视我对问题 2 的回答,希望我的其他回答有用!

关于ruby-on-rails - Rspec 测试所需参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15646339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com