rails rspec update_all 方法适用于控制器,但不适用于 rspec

qod*_*dot 3 rspec ruby-on-rails

** 控制器

puts merchants.first.is_blocked // 1

Merchant.update_all( {:is_blocked => 0}, "mch_id IN (#{@merchants.map(&:mch_id).join(",")})" )

puts merchants.first.is_blocked // 0, so it works
Run Code Online (Sandbox Code Playgroud)

** 规格

expect {
  get :update_merchants, params
}.to change { merchant_1.is_blocked }.from(1).to(0)

// result should have been changed to 0, but is now 1
Run Code Online (Sandbox Code Playgroud)

我不知道为什么“update_all”方法在控制器中有效而在 rspec 中无效

Jon*_*Jon 6

首先,您的 update_all 行非常糟糕。假设@merchants是一个 AREL 查询,具有定位您要更新的商家所需的条件,请考虑将其转换为:

@merchants.update_all(is_blocked: 0)
Run Code Online (Sandbox Code Playgroud)

如果@merchants 只是一个记录数组,那么使用这个:

Merchant.where(id: @merchants.map(&:id)).update_all(is_blocked: 0)
Run Code Online (Sandbox Code Playgroud)

其次,GET请求永远不应该修改数据库。考虑将其更改为PUT请求。

最后,如果您的merchant_1实例变量是在调用您的方法之前创建/获取的,您的测试仍然具有更改前的值。您要么需要重新获取它,要么reload在看到更新的值之前调用它。

expect {
  get :update_merchants, params
}.to change { merchant_1.reload.is_blocked }.from(1).to(0)
Run Code Online (Sandbox Code Playgroud)