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 中无效
首先,您的 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)