【问题标题】:undefined method `response_code' for nil:NilClass for IntegrationTest that failsnil 的未定义方法“response_code”:IntegrationTest 的 NilClass 失败
【发布时间】: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


【解决方案1】:

取决于您的控制器是否正在拯救 ActiveRecord::NotNullViolation 并呈现 400 ?我想控制器和规格如下所示

控制器代码

class User < ApplicationController
   def create
    .....
   rescue ActiveRecord::NotNullViolation => e
    render text: e.message, status: :bad_request 
  end
end

规格代码

it 'POST with null data returns bad request' do
  post to/user/path
  expect(response.code).to eq '400'
end

【讨论】:

  • 不,它没有。目前,我的目标不是找到返回 400 的方法;我的目标是在 HTTP 响应代码上断言,即使代码引发了异常。我已经手动对其进行了测试,并且我知道响应代码是 400。现在,我想编写一个测试用例来检查它。我想要assert_response 之类的东西,但即使抛出异常也能正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
相关资源
最近更新 更多