目标是覆盖以下线路:
如果对象无法保存
render :new, status: :unprocessable_entity
Post belongs_to :user
的类编写测试,例如
assert_no_difference "Post.count" do
post posts_path, params: { post: { user_id: nil } }
end
assert_response :unprocessable_entity
实际上永远不会到达响应阶段,因为
ActiveRecord::RecordInvalid:
将被提前调用。
块测试
assert_response :unprocessable_entity do
生成NoMethodError: undefined method 'response_code' for nil:NilClass
这个测试似乎有点没有实际意义,因为它会被上游的有效性测试覆盖。尽管如此,对可能绕过验证测试中断的好奇心还是很强烈......
unprocessable_entity可以在标准rails框架下测试吗?
降落在这里试图测试同样的!我的案例是在创建或更新模型时检查字符串
slug
的唯一性验证 Company
。
assert_response :unprocessable_entity
适用于我的案例!
也许 OP bug 存在于断言或变量定义的结构中?
这是在我的company_controller_test.rb文件中:
setup do
# variables defined in companies.yml
@company = companies(:one)
@company2 = companies(:two)
end
test "should check unique slug before creating company" do
assert_no_changes("Company.count") do
post companies_url, params: { company: { slug: @company2.slug } }
end
assert_response :unprocessable_entity
end
# trying to update company1 with company2 slug
test "should check unique slug before updating company" do
patch company_url(@company.slug), params: { company: { slug: @company2.slug } }
assert_response :unprocessable_entity
end
test/fixtures/companies.yml
中定义的公司变量:
one:
slug: CompanyOne
two:
slug: CompanyTwo