rspec 测试失败 rails 控制器中的代码

rspec test fails code in rails controller

在我的application_controller.rb中,有一行代码如下:

def index
 CaseStatus.order(:application_source).pluck(:application_source).uniq!
end

在我的rspec代码中,有一行代码访问application_controller的索引路径如下

visit applications_path

当我直接 运行 代码时,它工作得很好,但是当它通过 rspec 访问 application_controller.rb 时,我得到一个错误

NoMethodError:
  undefined method `compact' for nil:NilClass

不确定我通过 rspec 和水豚得到这个错误但是如果我 运行 代码为

def index
 CaseStatus.order(:application_source).pluck(:application_source)
end

它执行完美,没有错误。有点困惑 uniq! 在代码中中断了什么,结果突然变成了零。

我收到这个错误

 Failure/Error: @application_channels = CaseStatus.order(:application_source).pluck(:application_source).uniq!.compact if CaseStatus.order(:application_source).present?

 NoMethodError:
   undefined method `compact' for nil:NilClass
 # ./app/controllers/loan_applications_controller.rb:53:in `index'

我认为 uniq! 不是您希望在这种情况下使用的方法,请参阅:

Returns nil if no changes are made (that is, no duplicates are found). https://ruby-doc.org/core-2.2.0/Array.html#method-i-uniq-21

所以它是这样工作的:

2.3.1 :008 > a = [1,2,3,3,nil].uniq!
 => [1, 2, 3, nil]
2.3.1 :009 > a = [1,2,3,nil].uniq!
 => nil
2.3.1 :010 >

另一方面 uniq 的工作方式如下:

2.3.1 :010 > a = [1,2,3,3,nil].uniq
 => [1, 2, 3, nil]
2.3.1 :011 > a = [1,2,3,nil].uniq
 => [1, 2, 3, nil]

并且在 uniq 的输出中,运行 compact 删除 nil 值是安全的。