【发布时间】:2018-01-27 14:44:54
【问题描述】:
我对一列有一个非空约束。我有一个IntegrationTest 测试用例posts 没有该列的实例。 我的目标是断言返回的响应代码是 400。
我的第一次尝试是:
test "should fail if no context" do
post trips_url, params: { trip: { state: @trip.state } }
assert_response 400
end
但是 Minitest::UnexpectedError: ActiveRecord::NotNullViolation: SQLite3::ConstraintException: NOT NULL constraint failed: trips.context:... 失败了。
我不太明白。 post 是不是类似于 HTTP 客户端,所以它不应该受到控制器中抛出的异常的影响?
但无论如何,接下来我尝试了:
test "should fail if no context" do
assert_raises(ActiveRecord::NotNullViolation) do
post trips_url, params: { trip: { state: @trip.state } }
end
assert_response 400
end
但这会因Minitest::UnexpectedError: NoMethodError: undefined method `response_code' for nil:NilClass 而失败,好像response_code 没有设置,因为抛出了异常。
那么,我的问题是:如何实现我的目标?在测试端点时,我并不真正关心抛出了哪些异常。我关心它返回的响应。那么,在失败的情况下如何断言响应?
我正在使用Rails 5.1.4。
【问题讨论】:
-
这取决于你的控制器代码是什么样子的,你是在拯救控制器中的
ActiveRecord::NotNullViolation,然后返回一个 bad_request 吗? -
不,它没有。但是我已经手动对其进行了测试,它确实以 400 响应。我的目标是断言 HTTP 响应代码即使我的代码抛出了异常。
标签: ruby-on-rails ruby integration-testing ruby-on-rails-5.1