如何在Rails中使用minitest在控制器中测试@ project.save的失败?

时间:2019-05-13 14:22:17

标签: ruby-on-rails minitest

我正在尝试提高测试覆盖率(仅安装了simplecov),并且很高兴已经拥有良好的覆盖率。但是,我并没有在测试中发现一些失败模式,但是我不知道如何在Rails中创建对象时强制失败(例如,保存(5.2,如果很重要))。关于如何强制和捕获saveupdate_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的地方!

1 个答案:

答案 0 :(得分:0)

save在发生验证错误时返回false

查看您的Project模型并产生无效的参数。例如,如果有validates :some_field, presence: true,则跳过该字段,验证将失败。