如何使用 Rails 中的 minitest 测试控制器中(例如)@project.save 的失败?
How do I test for failure of (e.g.) @project.save in my controller using minitest in Rails?
我正在努力提高我的测试覆盖率(刚刚安装了 simplecov)并且很高兴已经有了很好的覆盖率。但是,我没有在我的测试中捕捉到一些失败模式,但我不知道如何强制失败,例如,在 Rails 中创建对象期间的保存(5.2,如果这很重要) .关于如何强制和捕获 save
或 update_attributes
方法的失败的任何指示?
我的主要测试工作正常。我只是不知道如何在测试中将代码强制下移到这些分支!
相关控制器方法:
def create
@project = current_user.projects.build(project_params)
if @project.save
flash[:notice] = "Project created!"
redirect_to user_path(current_user)
else
flash[:alert] = "There was an error. Your project was not created."
render 'new'
end
end
测试本次测试的第一个分支(if @project.save
)。第二个 (else
) 不是。我用来测试成功的测试如下:
sign_in @user
assert_difference 'Project.count', 1 do
post projects_path, params: {project: {name: @new_project_name, user_id: @user.id}}
end
assert_redirected_to user_path(@user)
我真正想要的是我可以assert_no_difference
成功的事情!
save
returns false
当出现验证错误时。
查看您的 Project
模型并生成无效参数。例如,如果有 validates :some_field, presence: true
则跳过该字段,验证将失败。
我正在努力提高我的测试覆盖率(刚刚安装了 simplecov)并且很高兴已经有了很好的覆盖率。但是,我没有在我的测试中捕捉到一些失败模式,但我不知道如何强制失败,例如,在 Rails 中创建对象期间的保存(5.2,如果这很重要) .关于如何强制和捕获 save
或 update_attributes
方法的失败的任何指示?
我的主要测试工作正常。我只是不知道如何在测试中将代码强制下移到这些分支!
相关控制器方法:
def create
@project = current_user.projects.build(project_params)
if @project.save
flash[:notice] = "Project created!"
redirect_to user_path(current_user)
else
flash[:alert] = "There was an error. Your project was not created."
render 'new'
end
end
测试本次测试的第一个分支(if @project.save
)。第二个 (else
) 不是。我用来测试成功的测试如下:
sign_in @user
assert_difference 'Project.count', 1 do
post projects_path, params: {project: {name: @new_project_name, user_id: @user.id}}
end
assert_redirected_to user_path(@user)
我真正想要的是我可以assert_no_difference
成功的事情!
save
returns false
当出现验证错误时。
查看您的 Project
模型并生成无效参数。例如,如果有 validates :some_field, presence: true
则跳过该字段,验证将失败。